[机器学习与scikit-learn-29]:算法-回归-普通线性回归LinearRegression拟合线性分布数据的代码示例
Posted 文火冰糖的硅基工坊
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[机器学习与scikit-learn-29]:算法-回归-普通线性回归LinearRegression拟合线性分布数据的代码示例相关的知识,希望对你有一定的参考价值。
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客
本文网址:
目录
第1章 LinearRegression类说明
- fit_intercept: y = kx + b,b就是截距,这里指定是否需要带参数。
- normalize:是否需要对数据进行中心化。
- copy_X:是否需要对X样本进行拷贝,当使用normalize时,是否需要覆盖输入样本。
线性回归的类可能是最简单的类,仅有四个参数就可以完成一个完整的算法。
并且看得出,这些参数中并没有一个是必填的,都有默认值,更没有对我们的模型有不可替代作用的超参数。
这说明,线性回归的性能,往往取决于数据本身,并没有可以调整的模型的超参数,线性回归也因此对数据有着很高的要求。
幸运的是,现实中大部分连续型变量之间,都存在着或多或少的线性联系。所以线性回归虽然简单,却很强大。
同时,sklearn中的线性回归可以处理多标签问题,只需要在fit的时候输入多维度标签就可以了。
备注:
本文的重点放在用线性模型拟合线性分布的多维度数据。
第2章 LinearRegression使用的代码示例
2.1 导入库
#1.导入库
from sklearn.linear_model import LinearRegression as LR
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
from sklearn.datasets import fetch_california_housing as fch #加利福尼亚房屋价值数据集
import pandas as pd
2.2 导数数据集
#2. 导入数据集
housevalue = fch() #会需要下载,大家可以提前运行试试看
X = pd.DataFrame(housevalue.data) #放入DataFrame中便于查看
y = housevalue.target
print(X.shape)
print(y.shape)
print(X.head())
print(housevalue.feature_names)
X.columns = housevalue.feature_names
X.columns
"""
MedInc:该街区住户的收入中位数
HouseAge:该街区房屋使用年代的中位数
AveRooms:该街区平均的房间数目
AveBedrms:该街区平均的卧室数目
Population:街区人口
AveOccup:平均入住率
Latitude:街区的纬度
Longitude:街区的经度
"""
# 打印排序后的样本标签值
plt.plot(range(len(y)) ,sorted(y) )
(20640, 8) (20640,) 0 1 2 3 4 5 6 7 0 8.3252 41.0 6.984127 1.023810 322.0 2.555556 37.88 -122.23 1 8.3014 21.0 6.238137 0.971880 2401.0 2.109842 37.86 -122.22 2 7.2574 52.0 8.288136 1.073446 496.0 2.802260 37.85 -122.24 3 5.6431 52.0 5.817352 1.073059 558.0 2.547945 37.85 -122.25 4 3.8462 52.0 6.281853 1.081081 565.0 2.181467 37.85 -122.25 ['MedInc', 'HouseAge', 'AveRooms', 'AveBedrms', 'Population', 'AveOccup', 'Latitude', 'Longitude']
房价有最低值和最高值.
2.3 分割数据集
#3. 分割数据集
Xtrain, Xtest, Ytrain, Ytest = train_test_split(X,y,test_size=0.3,random_state=420)
for i in [Xtrain, Xtest]:
i.index = range(i.shape[0])
print(X.shape)
print(Xtrain.shape)
print(Xtest.shape)
(20640, 8) (14448, 8) (6192, 8)
2.4 建立模型与进行训练
#4. 建立模型并进行训练
model = LR()
model = model.fit(Xtrain, Ytrain)
# 模型预测
Y_pred = model.predict(Xtest)
print("预测值:", Y_pred)
# 训练好的模型参数: y = k*x + b
print("训练好的模型参数:")
print("截距b的值 :", model.intercept_)
print("特征权重系数K的值:", model.coef_)
# 模型特征权重值与特征的名称组合起来
[*zip(Xtrain.columns,model.coef_)]
预测值: [1.51384887 0.46566247 2.2567733 ... 2.11885803 1.76968187 0.73219077] 训练好的模型参数: 截距b的值 : -36.25689322920384 特征权重系数K的值: [ 4.37358931e-01 1.02112683e-02 -1.07807216e-01 6.26433828e-01 5.21612535e-07 -3.34850965e-03 -4.13095938e-01 -4.26210954e-01]
预测值: [1.51384887 0.46566247 2.2567733 ... 2.11885803 1.76968187 0.73219077] 训练好的模型参数: 截距b的值 : -36.25689322920384 特征权重系数K的值: [ 4.37358931e-01 1.02112683e-02 -1.07807216e-01 6.26433828e-01 5.21612535e-07 -3.34850965e-03 -4.13095938e-01 -4.26210954e-01]
Out[26]:
[('MedInc', 0.4373589305968406),
('HouseAge', 0.010211268294493916),
('AveRooms', -0.1078072161731777),
('AveBedrms', 0.6264338275363787),
('Population', 5.216125353122233e-07),
('AveOccup', -0.003348509646333547),
('Latitude', -0.41309593789477145),
('Longitude', -0.4262109536208467)]
备注:影响房价的主要因素为:
('AveBedrms', 0.6264338275363787), # 房间数
[('MedInc', 0.4373589305968406), # 该街区住户的收入中位数
2.5 MSE、MAE评估
# 5. MSE评估指标
import sklearn
from sklearn.metrics import mean_squared_error as MSE
mse_score = MSE(Y_pred, Ytest)
print("均分误差MSE=", mse_score)
print("预测最大值:", Y_pred.max())
print("预测最小值:", Y_pred.min())
print("标签最大值:", y.max())
print("标签最小值:", y.min())
# 对训练好的模型进行交叉验证
# cv=交叉验证的次数
# scoring:打分指标:neg_mean_squared_error,
# 在sklearn交叉验证中,损失/误差都是用负数表示,去掉负号,就是它的均分误差值
# 负号:表示损失!!!
mse_score = cross_val_score(model, X,y,cv=5, scoring="neg_mean_squared_error")
print("交叉验证的MSE=", mse_score)
mse_score = cross_val_score(model, X,y,cv=5, scoring="neg_mean_absolute_error")
print("交叉验证的MAE=", mse_score)
# 打印有哪些评估指标
sorted(sklearn.metrics.SCORERS.keys())
均分误差MSE= 0.5309012639324571 预测最大值: 7.146198214270875 预测最小值: -0.6528439725036179 标签最大值: 5.00001 标签最小值: 0.14999 交叉验证的MSE= [-0.48485857 -0.62249739 -0.64621047 -0.5431996 -0.49468484] 交叉验证的MAE= [-0.54599439 -0.5661782 -0.57654952 -0.53190614 -0.5168527 ]
2.6 R2评估
# 6. R2评估指标: 反应了模型准确性的指标
# R2的值越接近1,模型的准确性越好
# R2的值越接近0,模型的准确性越差
from sklearn.metrics import r2_score
r2 = r2_score(Ytest,Y_pred)
print("r2=",r2)
r2 = model.score(Xtest,Ytest)
print("r2=",r2)
r2= 0.6043668160178817 r2= 0.6043668160178817
备注:
R2越接近1,指标越好
0.6左右的R2指标不算好,
2.7 模型指标分析
# 查找指标不好的原因
import matplotlib.pyplot as plt
print("Ytest.min", Ytest.min())
print("Ytest.max", Ytest.max())
print("Y_pred.min", Y_pred.min())
print("Y_pred.max", Y_pred.max())
plt.plot(range(len(Ytest)) ,sorted(Ytest), c="black",label= "Data")
plt.plot(range(len(Y_pred)),sorted(Y_pred),c="red", label = "Predict")
plt.legend()
plt.show()
### 备注
# 预测值的走势与样本标签值的走势在界限范围内基本相似
# 预测值在两边的边界相差较大,预测值会趋于正无穷和负无穷
# 而标签样本中的数值是有上限制与下限
Ytest.min 0.14999 Ytest.max 5.00001 Y_pred.min -0.6528439725036179 Y_pred.max 7.146198214270875
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客
本文网址:
以上是关于[机器学习与scikit-learn-29]:算法-回归-普通线性回归LinearRegression拟合线性分布数据的代码示例的主要内容,如果未能解决你的问题,请参考以下文章
机器学习机器学习入门02 - 数据拆分与测试&算法评价与调整