<jupyter_start><jupyter_text>线性回归  【关键词】最小二乘法，线性  一、普通线性回归  1、原理 分类的目标变量是标称型数据，而回归将会对连续型的数据做出预测。 应当怎样从一大堆数据里求出回归方程呢？假定输人数据存放在矩阵X中，而回归系数存放在向量W中。那么对于给定的数据X1, 预测结果将会通过Y=X*W给出。现在的问题是，手里有一些X和对应的Y,怎样才能找到W呢？一个常用的方法就是找出使误差最小的W。这里的误差是指预测Y值和真实Y值之间的差值，使用该误差的简单累加将使得正差值和负差值相互抵消，所以我们采用平方误差。 最小二乘法 平方误差可以写做:![1.PNG](attachment:1.PNG)对W求导，当导数为零时，平方误差最小，此时W等于：![2.PNG](attachment:2.PNG) 例如有下面一张图片：![3.PNG](attachment:3.PNG)求回归曲线，得到：![4.PNG](attachment:4.PNG)  2、实例 导包<jupyter_code>import numpy as np
import pandas as pd
from pandas import Series,DataFrame

# 获取糖尿病信息
from sklearn.datasets import load_diabetes

import matplotlib.pyplot as plt
%matplotlib inline<jupyter_output><empty_output><jupyter_text>获取糖尿病数据<jupyter_code>diabete = load_diabetes()
data = diabete.data
target = diabete.target
feature_names = diabete.feature_names
train = DataFrame(data=data,columns=feature_names)<jupyter_output><empty_output><jupyter_text>抽取训练数据和预测数据<jupyter_code>from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(train,target,test_size=0.2,random_state=1)<jupyter_output><empty_output><jupyter_text>创建数学模型<jupyter_code>from sklearn.linear_model import LinearRegression
linear = LinearRegression()<jupyter_output><empty_output><jupyter_text>第一步：训练<jupyter_code>linear.fit(X_train,y_train)
linear.score(X_test,y_test)<jupyter_output><empty_output><jupyter_text>第二步：预测 第三步：绘制图形<jupyter_code>y_ = linear.predict(X_test)
plt.plot(y_,label='Preidict')
plt.plot(y_test,label='True')
from sklearn.metrics import r2_score
r2_score(y_test,y_)
np.abs(y_test-y2_).mean()
np.abs(y_test - y_).mean()
from sklearn.neighbors import KNeighborsRegressor
knnrgr = KNeighborsRegressor()
knnrgr.fit(X_train,y_train)
y2_ = knnrgr.predict(X_test)
(y_test - y2_).mean()
y_test
y_
# 残差直方图 观察线性回归模型的好坏
# x轴表示真实值和预测值之间的差
# y轴表示落在某个差区间的数据的数量
# 一般符合正态分布，图越瘦高就越好，越扁平就越不好
plt.figure(figsize=(8,6))
ax1 = plt.subplot(121)
h1 = ax1.hist(y_test-y_,bins=10,color='blue')

ax2 = plt.subplot(122)
h2 = ax2.hist(y_test-y2_,bins=10,color='cyan')
train
# 研究一个特征对结果的影响
train1 = train['bmi']
train1 = train1.values.reshape(-1,1)
linear1 = LinearRegression()
X_train,X_test,y_train,y_test = train_test_split(train1,target,test_size=0.2,random_state=1)
linear1.fit(X_train,y_train)
y_ = linear1.predict(X_test)
plt.scatter(X_train,y_train)
test = np.linspace(X_train.min(),X_train.max(),100).reshape(-1,1)
y_ = linear1.predict(test)
plt.plot(test,y_,color='red')
plt.scatter(X_train,y_train)<jupyter_output><empty_output><jupyter_text>二、岭回归  1、原理 缩减系数来“理解”数据 如果数据的特征比样本点还多应该怎么办？是否还可以使用线性回归和之前的方法来做预测？答案是否定的，即不能再使用前面介绍的方法。这是因为输入数据的矩阵X不是满秩矩阵。非满秩矩阵在求逆时会出现问题。为了解决这个问题，统计学家引入了岭回归（ridge regression)的概念 ![5.PNG](attachment:5.PNG) 缩减方法可以去掉不重要的参数，因此能更好地理解数据。此外，与简单的线性回归相比，缩减法能取得更好的预测效果。 岭回归是加了二阶正则项的最小二乘，主要适用于过拟合严重或各变量之间存在多重共线性的时候，岭回归是有bias的，这里的bias是为了让variance更小。  归纳总结 1.岭回归可以解决特征数量比样本量多的问题2.岭回归作为一种缩减算法可以判断哪些特征重要或者不重要，有点类似于降维的效果3.缩减算法可以看作是对一个模型增加偏差的同时减少方差 岭回归用于处理下面两类问题：1.数据点少于变量个数2.变量间存在共线性（最小二乘回归得到的系数不稳定，方差很大）  2、实例 岭回归一般用在样本值不够的时候<jupyter_code>import numpy as np
import pandas as pd
from pandas import Series,DataFrame
x = np.array([[1,1,1],[2,2,2]])
y = np.array([3,1])<jupyter_output><empty_output><jupyter_text>使用普通线性回归<jupyter_code>from sklearn.linear_model import LinearRegression,Ridge
linear = LinearRegression()
linear.fit(x,y)
# 获取机器学习模型的系数
linear.coef_<jupyter_output><empty_output><jupyter_text>使用岭回归<jupyter_code># alpha 就是岭回归中的λ
ridge = Ridge(alpha=5)
ridge.fit(x,y)
ridge.coef_
# 构建模型
# 训练fit()
# 预测predict()
# 使用岭回归处理波士顿房价信息
from sklearn.datasets import load_boston
boston = load_boston()
data = boston.data
target = boston.target
from sklearn.model_selection import train_test_split
# 发现归一化数据仍然不在一个量级，所以可以使用区归一化
data = data/data.sum()
data
data/(data.max(axis=0) - data.min(axis=0))
from sklearn.preprocessing import Normalizer,MinMaxScaler,StandardScaler
Normalizer().fit_transform(data)
MinMaxScaler().fit_transform(data)
StandardScaler().fit_transform(data)
# 总结：数据归一化可以多种选择，最后选取最好的一种
train = StandardScaler().fit_transform(data)
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(train,target,test_size=0.2,random_state=1)
linear = LinearRegression()
linear.fit(X_train,y_train)
from sklearn.metrics import r2_score
y_ = linear.predict(X_test)
r2_score(y_test,y_)
import matplotlib.pyplot as plt
%matplotlib inline
# 绘制残差直方图
ax = plt.subplot(111)
h = ax.hist(y_test-y_,bins=40,color='blue')
ridge = Ridge(alpha=10)
ridge.fit(X_train,y_train)
y2_ = ridge.predict(X_test)
r2_score(y_test,y2_)
ax = plt.subplot(111)
h=ax.hist(y_test-y2_,bins=40,color='blue')<jupyter_output><empty_output><jupyter_text>深入研究岭回归- 理解岭回归缩减系数）【备注】coef_函数可以获取机器学习模型中各个特征值的系数 拓展：岭回归 创建一个假象数据样本集<jupyter_code>X = 1. / (np.arange(1, 11) + np.arange(0, 10).reshape(-1,1))
y = np.array([1,2,3,4,5,6,7,8,9,0])
X.shape
y<jupyter_output><empty_output><jupyter_text>创建一个alpha集合，用以验证种不同alpha值对预测系数的结果的影响<jupyter_code>n_alphas = 200
alphas = np.logspace(-10, -2, n_alphas)
ridge = Ridge()

coefs = []

for alpha in alphas:
    ridge.set_params(alpha=alpha)
    ridge.fit(X,y)
    coefs.append(ridge.coef_)
coefs<jupyter_output><empty_output><jupyter_text>创建岭回归机器学习算法对象 使用不同的alpha进行数据训练，保存所有训练结果的coef_ 绘图查看alpha参数和coefs的关系<jupyter_code>plt.figure(figsize=(10,8))
ax = plt.subplot(111)
plt.xscale('log')
plt.plot(alphas,coefs)
ax.set_xlim(ax.get_xlim()[::-1])<jupyter_output><empty_output><jupyter_text>三、lasso回归  1、原理 【拉格朗日乘数法】对于参数w增加一个限定条件，能到达和岭回归一样的效果：![6.PNG](attachment:6.PNG) 在lambda足够小的时候，一些系数会因此被迫缩减到0<jupyter_code>boston = load_boston()
from sklearn.linear_model import Lasso
# alpha就是压缩系数的阀值
lasso = Lasso(alpha=1)
lasso.fit(boston.data,boston.target)
# 观察发现，lasso把三个系数压缩为0
lasso.coef_
ridge = Ridge(alpha=30)
ridge.fit(boston.data,boston.target)
# 岭回归也可以缩减系数，但是没有lasso缩减的强烈
ridge.coef_<jupyter_output><empty_output><jupyter_text>2、实例  四、普通线性回归、岭回归与lasso回归比较 导包，导入sklearn.metrics.r2_score用于给模型打分<jupyter_code>n_features = 200
n_samples = 50
X = np.random.randn(n_samples,n_features)<jupyter_output><empty_output><jupyter_text>使用numpy创建数据X，创建系数，对系数进行处理，对部分系数进行归零化操作，然后根据系数进行矩阵操作求得目标值  增加噪声<jupyter_code># 创建200个系数
coefs = np.random.random(size=200)
# 把后190个系数都设置为0,只保留10个有效数字，作为有效系数
coefs[10:] = 0
# 把真实的系数打乱
np.random.shuffle(coefs)
# 使用真实的系数跟样本集相乘，得到每一个样本的样本标签
y = np.dot(X,coefs)
noise = np.random.random(50) - 0.5
y += noise
X,y<jupyter_output><empty_output><jupyter_text>训练数据和测试数据<jupyter_code>from sklearn.linear_model import LinearRegression,Ridge,Lasso
linear = LinearRegression()
ridge = Ridge(alpha=0.5)
lasso = Lasso(alpha=0.3)

linear.fit(X,y)
ridge.fit(X,y)
lasso.fit(X,y)

plt.figure(figsize=(12,8))
ax1 = plt.subplot(2,2,1)
ax1.plot(coefs,color='red')
ax1.set_title('True')

ax2 = plt.subplot(2,2,2)
ax2.plot(linear.coef_,color='green')
ax2.set_title('Linear')

ax3 = plt.subplot(2,2,3)
ax3.plot(ridge.coef_,color='orange')
ax3.set_title('Ridge')

ax4 = plt.subplot(2,2,4)
ax4.plot(lasso.coef_,color='blue')
ax4.set_title('Lasso')<jupyter_output><empty_output><jupyter_text>分别使用线性回归，岭回归，Lasso回归进行数据预测 数据视图，此处获取各个算法的训练数据的coef_:系数<jupyter_code>r2_score(y,linear.predict(X))
r2_score(y,ridge.predict(X))
r2_score(y,lasso.predict(X))<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.13551077136900624, 'fraction_numerical': 0.02738012508686588, 'mean_word_length': 10.476874003189792, 'pattern_counts': {'":': 0, '<': 69, '<?xml version=': 0, '>': 69, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '17', 'dir': 'jupyter-structured-clean-dedup', 'id': '229736', 'license': 'Apache-2.0', 'n_tokens_mistral': 4041, 'n_tokens_neox': 4284, 'n_words': 335, 'path': 'LinearRegression .ipynb', 'repo_name': 'CherrieAI/sklearnPrac', 'size': '7195'}