线性回归、岭回归
2018-11-27 本文已影响26人
囧书
用sklearn
内置的波士顿房屋数据集做一下房价预测,练习线性回归的API。
- 正规方程法
- 梯度下降法
- 岭回归
获取数据集
加载sklearn
的boston
数据集,返回训练集、测试集、以及目标值标准化模型。
线性回归求目标值是对各特征加和,因此需要对数据做标准化处理。
def preprocess():
# 获取数据
boston = load_boston()
print("feature_names:")
print(boston.feature_names)
print("data:")
print(boston.data[:5])
print("target:")
print(boston.target[:5])
# 划分训练集测试集
x_train, x_test, y_train, y_test = train_test_split(boston.data, boston.target, test_size=0.25)
# 线性回归需要对特征数据和目标数据进行标准化处理
# 特征数据标准化
std_x = StandardScaler()
std_x.fit(x_train)
x_train = std_x.transform(x_train)
x_test = std_x.transform(x_test)
# 目标数据标准化
# StandardScaler的transform要求传入二维数据,故此处reshape
y_train = y_train.reshape(-1, 1)
std_y = StandardScaler()
std_y.fit(y_train)
y_train = std_y.transform(y_train)
return x_train, x_test, y_train, y_test, std_y
输出:
****************************** 数据集 ******************************
feature_names:
['CRIM' 'ZN' 'INDUS' 'CHAS' 'NOX' 'RM' 'AGE' 'DIS' 'RAD' 'TAX' 'PTRATIO'
'B' 'LSTAT']
data:
[[6.3200e-03 1.8000e+01 2.3100e+00 0.0000e+00 5.3800e-01 6.5750e+00
6.5200e+01 4.0900e+00 1.0000e+00 2.9600e+02 1.5300e+01 3.9690e+02
4.9800e+00]
[2.7310e-02 0.0000e+00 7.0700e+00 0.0000e+00 4.6900e-01 6.4210e+00
7.8900e+01 4.9671e+00 2.0000e+00 2.4200e+02 1.7800e+01 3.9690e+02
9.1400e+00]
[2.7290e-02 0.0000e+00 7.0700e+00 0.0000e+00 4.6900e-01 7.1850e+00
6.1100e+01 4.9671e+00 2.0000e+00 2.4200e+02 1.7800e+01 3.9283e+02
4.0300e+00]
[3.2370e-02 0.0000e+00 2.1800e+00 0.0000e+00 4.5800e-01 6.9980e+00
4.5800e+01 6.0622e+00 3.0000e+00 2.2200e+02 1.8700e+01 3.9463e+02
2.9400e+00]
[6.9050e-02 0.0000e+00 2.1800e+00 0.0000e+00 4.5800e-01 7.1470e+00
5.4200e+01 6.0622e+00 3.0000e+00 2.2200e+02 1.8700e+01 3.9690e+02
5.3300e+00]]
target:
[24. 21.6 34.7 33.4 36.2]
建模
正规方程法:
model = LinearRegression()
model.fit(x_train, y_train)
梯度下降法:
# max_iter: 最大迭代次数
model = SGDRegressor(max_iter=10)
model.fit(x_train, y_train.ravel())
岭回归:
# alpha: 正则化力度
model = Ridge(alpha=1.0)
model.fit(x_train, y_train.ravel())
预测
def predict(model, x_test, y_test, std_y):
# 回归系数
print("回归系数:")
print(model.coef_)
# 预测结果
print("真实值:")
print(y_test[:10])
y_predict = model.predict(x_test)
y_predict = std_y.inverse_transform(y_predict)
print("预测值:")
print(np.around(y_predict[:10].flatten(), decimals=1))
print("均方误差:")
print(mean_squared_error(y_test, y_predict))
输出:
****************************** 线性回归:正规方程法 ******************************
回归系数:
[[-0.06186526 0.13107583 0.04516768 0.05849482 -0.18127294 0.28983444
-0.0302648 -0.32734363 0.28317058 -0.25426876 -0.24581878 0.0966923
-0.41279297]]
真实值:
[34.9 20.6 24.1 37.2 12.8 25. 46. 14.5 21.5 22.9]
预测值:
[30.3 16.4 25.7 32.7 12.8 22.3 39.9 12.9 22. 20. ]
均方误差:
25.39621815792282
****************************** 线性回归:梯度下降法 ******************************
回归系数:
[-0.04176259 0.08606617 -0.01498182 0.06544983 -0.10239262 0.31993282
-0.04230784 -0.25439308 0.1088705 -0.07597648 -0.22770765 0.09737765
-0.37915806]
真实值:
[34.9 20.6 24.1 37.2 12.8 25. 46. 14.5 21.5 22.9]
预测值:
[31. 17.5 25.8 31.8 13.3 22.4 39.2 13.5 23.2 21.9]
均方误差:
25.956482620192624
****************************** 岭回归 ******************************
回归系数:
[-0.06091708 0.12885114 0.04121933 0.05930487 -0.17777864 0.2910496
-0.03091966 -0.32345932 0.27206837 -0.24330282 -0.24454616 0.0965778
-0.41066292]
真实值:
[34.9 20.6 24.1 37.2 12.8 25. 46. 14.5 21.5 22.9]
预测值:
[30.4 16.5 25.7 32.7 12.9 22.3 39.9 12.9 22. 20.1]
均方误差:
25.376589190071144
正规方程法适用于小数据集,100万条样本以下。
对于大数据集则建议使用梯度下降。
而岭回归加入了正则化,稳定性更好。
源码
Github: LinearRegression