线性回归sklearn实现
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
#生成位于区间(-6,6)的等间隔的100个点
x = np.linspace(-6,6,100)
#生成对应的函数值
y = 0.5 * x + 2
#绘制直线图形
plt.plot(x,y)
结果如下:
#已知两点(2,3),(6,5),绘制一条直线
x = np.array([2,6])
y = np.array([3,5])
plt.plot(x,y)
运行结果如下:
#利用sklearn线性回归求直线斜率
from sklearn.linear_model import LinearRegression
属性:intercept:截距
normalize:标准化
copy_X:标准化后是否覆盖原数据
n_jobs:设置计算任务个数
coef_:feature系数,只能查看K值,不能看b值
intercept_:查看b值
rank_:查看矩阵的秩
singular_:查看矩阵的奇异值
方法:fit:训练模型
predict:模型预测
score:模型评估
#线性回归模型实例化(输入系数矩阵x必须是矩阵,行数是样本数,列数是特征数)
lr = LinearRegression()
x = np.array([2,6])
y = np.array([3,5])
x = x.reshape(-1,1)
#模型训练
lr.fit(x,y)
print("过两点(2,3)与(6,5)的直线的斜率为:{},截距为:{:.2f}".format(lr.coef_,lr.intercept_))
运行结果如下:
#模型预测
x_test = np.array([3,4,5]).reshape(-1,1)
y_predict = lr.predict(x_test)
#模型评估--计算R方值(不能说准确率)
lr.score(x,y)
#计算模型lr的均分误差
from sklearn.metrics import mean_squared_error
y = 0.5 * x_test + 2
mean_squared_error(y,y_predict)
运行结果为1.0
6.573840876841765e-32
#假设有第三个点,坐标为(3,6)
x2 = np.array([[2],[3],[6]])
y2 = np.array([3,6,5])
#绘制三个点的散点图
plt.scatter(x2,y2,s=180,c='r')#s是点的大小,c是点的颜色
运行结果如下:
#利用线性回归模型拟合一条均方误差最小的直线
lr_2 = LinearRegression()
lr_2.fit(x2,y2)
y2_predict = lr_2.predict(x_test)
print(y2_predict)
print(lr_2.coef_,lr_2.intercept_)
运行结果为[4.46153846 4.76923077 5.07692308]
[0.30769231] 3.5384615384615388
#绘制拟合出的直线
z = np.linspace(0.6,10)
z_predict = lr_2.predict(z.reshape(-1,1))
plt.plot(z,z_predict,lw=5,c='g')
plt.scatter(x2,y2,s=180,c='r')
运行结果:
#计算模型lr_2的R方系数
lr_2.score(x2,y2)
#计算模型lr_2的均方误差
from sklearn.metrics import mean_squared_error
mean_squared_error(y2,y2_predict)
运行结果为0.17582417582417564
1.2189349112426031
n_informative:每个样本有多少个特征,默认为10
n_targets:决定生成的目标变量的数量
noise:噪声点
#利用sklearn生成100条具有1个特征的回归分析数据集
X_3,y_3 = make_regression(n_samples=100,n_features=1)
plt.scatter(X_3,y_3)
运行结果如下:
X_3,y_3 = make_regression(n_samples=100,n_features=1,noise=50,random_state=8)
plt.scatter(X_3,y_3)
运行结果如下:
X_3,y_3 = make_regression(n_samples=100,n_features=1,noise=50,bias=100,random_state=8)
plt.scatter(X_3,y_3)
运行结果如下:
#利用线性回归模型对数据X_3,y_3进行拟合
#模型实例化
reg = LinearRegression()
#模型训练
reg.fit(X_3,y_3)
#绘制回归直线
z=np.linspace(-3,3,200).reshape(-1,1)
plt.scatter(X_3,y_3,c='orange',s=30)
plt.plot(z,reg.predict(z),c='g')
plt.title('Linear Regression')
运行结果如下:
print('回归直线的斜率是:{:.2f}'.format(reg.coef_[0]))
print('回归直线的截距是:{:.2f}'.format(reg.intercept_))
运行结果为:回归直线的斜率是:68.78
回归直线的截距是:101.25
糖尿病数据集的线性回归分析
#导入糖尿病数据集
from sklearn.datasets import load_diabetes
diabetes = load_diabetes()
print(diabetes['DESCR'])
X = diabetes.data#特征变量
y = diabetes.target#因变量
X.shape,y.shape
运行结果为:((442, 10), (442,))
#划分训练集和测试集
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=8)
#模型实例化+模型训练
lr = LinearRegression().fit(X_train,y_train)
print("训练数据集得分:{:.2f}".format(lr.score(X_train,y_train)))
print("测试数据集得分:{:.2f}".format(lr.score(X_test,y_test)))
运行结果为:训练数据集得分:0.53
测试数据集得分:0.46
岭回归的sklearn实现
#导入岭回归模块
from sklearn.linear_model import Ridge
#模型实例化
ridge = Ridge()
#模型训练
ridge.fit(X_train,y_train)
print("训练数据集得分:{:.2f}".format(ridge.score(X_train,y_train)))
print("测试数据集得分:{:.2f}".format(ridge.score(X_test,y_test)))
运行结果为:训练数据集得分:0.43
测试数据集得分:0.43
#岭回归的参数调节
#正则化系数为10
ridge10 = Ridge(alpha=10).fit(X_train,y_train)
print("训练数据集得分:{:.2f}".format(ridge10.score(X_train,y_train)))
print("测试数据集得分:{:.2f}".format(ridge10.score(X_test,y_test)))
运行结果为:训练数据集得分:0.15
测试数据集得分:0.16
#岭回归的参数调节
#正则化系数为0.1
ridge01 = Ridge(alpha=0.1).fit(X_train,y_train)
print("训练数据集得分:{:.2f}".format(ridge01.score(X_train,y_train)))
print("测试数据集得分:{:.2f}".format(ridge01.score(X_test,y_test)))
运行结果为:训练数据集得分:0.52
测试数据集得分:0.47
#模型系数的可视化比较
plt.plot(ridge.coef_,'s',label='Ridge alpha=1')
plt.plot(ridge10.coef_,'^',label='Ridge alpha=10')
plt.plot(ridge01.coef_,'v',label='Ridge alpha=0.1')
plt.plot(lr.coef_,'o',label='linear regression')
plt.xlabel("系数序号")
plt.ylabel("系数量级")
plt.hlines(0,0,len(lr.coef_))
plt.legend(loc='best')
plt.grid(linestyle=':')
运行结果如下:
#绘制学习曲线:取固定的alpha值,改变训练集的数据量
from sklearn.model_selection import learning_curve,KFold
def plot_learning_curve(est,X,y):
training_set_size,train_scores,test_scores = learning_curve(
est,X,y,train_sizes=np.linspace(.1,1,20),cv=KFold(20,shuffle=True,
random_state=1))
estimator_name = est.__class__.__name__
line = plt.plot(training_set_size,train_scores.mean(axis=1),'--',
label="training"+estimator_name)
plt.plot(training_set_size,test_scores.mean(axis=1),'-',
label="test"+estimator_name,c=line[0].get_color())
plt.xlabel('Training set size')
plt.ylabel('Score')
plt.ylim(0,1.1)
plot_learning_curve(Ridge(alpha=1),X,y)
plot_learning_curve(LinearRegression(),X,y)
plt.legend(loc=(0,1.05),ncol=2,fontsize=11)
plt.grid(linestyle=':')
运行结果如下:
LASSO回归的sklearn实现
#导入LASSO回归模块
from sklearn.linear_model import Lasso
#模型实例化
lasso = Lasso()
#模型训练
lasso.fit(X_train,y_train)
print("训练数据集得分:{:.2f}".format(lasso.score(X_train,y_train)))
print("测试数据集得分:{:.2f}".format(lasso.score(X_test,y_test)))
#特征选择
print("套索回归使用的特征数:{}".format(np.sum(lasso.coef_!=0)))
运行结果为:
训练数据集得分:0.36 测试数据集得分:0.37 套索回归使用的特征数:3
LASSO回归的参数调节
#增加最大迭代次数的默认设置,默认max_iter=1000
lasso = Lasso(max_iter=100000)
lasso.fit(X_train,y_train)
print("训练数据集得分:{:.2f}".format(lasso.score(X_train,y_train)))
print("测试数据集得分:{:.2f}".format(lasso.score(X_test,y_test)))
#特征选择
print("套索回归使用的特征数:{}".format(np.sum(lasso.coef_!=0)))
运行结果为:
训练数据集得分:0.36 测试数据集得分:0.37 套索回归使用的特征数:3
#增加最大迭代次数的默认设置,默认max_iter=1000
#同时调整alpha的值
lasso01 = Lasso(alpha=0.1,max_iter=100000).fit(X_train,y_train)
print("alpha=0.1时套索回归在训练数据集得分:{:.2f}".format(lasso01.score(X_train,y_train)))
print("alpha=0.1时套索回归在测试数据集得分:{:.2f}".format(lasso01.score(X_test,y_test)))
print("alpha=0.1时套索回归使用的特征数:{}".format(np.sum(lasso01.coef_!=0)))
运行结果为:
alpha=0.1时套索回归在训练数据集得分:0.52 alpha=0.1时套索回归在测试数据集得分:0.48 alpha=0.1时套索回归使用的特征数:7
#调整alpha的值为0.0001
lasso00001 = Lasso(alpha=0.0001,max_iter=100000).fit(X_train,y_train)
print("alpha=0.0001时套索回归在训练数据集得分:{:.2f}".format(lasso00001.score(X_train,y_train)))
print("alpha=0.0001时套索回归在测试数据集得分:{:.2f}".format(lasso00001.score(X_test,y_test)))
print("alpha=0.0001时套索回归使用的特征数:{}".format(np.sum(lasso00001.coef_!=0)))
运行结果为:
alpha=0.0001时套索回归在训练数据集得分:0.53 alpha=0.0001时套索回归在测试数据集得分:0.46 alpha=0.0001时套索回归使用的特征数:10
#模型系数的可视化比较
plt.plot(ridge.coef_,'s',label='Ridge alpha=1')
plt.plot(ridge10.coef_,'^',label='Ridge alpha=10')
plt.plot(ridge01.coef_,'v',label='Ridge alpha=0.1')
plt.plot(lr.coef_,'o',label='linear regression')
plt.plot(lasso.coef_,'D',label="Lasso alpha=1")
plt.plot(lasso01.coef_,'H',label="Lasso alpha=0.1")
plt.plot(lasso00001.coef_,'p',label="Lasso alpha=0.0001")
plt.plot(ridge01.coef_,'<',label="Ridge alpha=0.1")
plt.xlabel("系数序号")
plt.ylabel("系数量级")
plt.hlines(0,0,len(lr.coef_))
plt.legend(loc='best')
plt.grid(linestyle=':')
运行结果如下:
结论:LASSO回归相对于岭回归,更适合做特征选择