设有数据集 ,对于每一个样本 ,令
称 为数据集 的设计矩阵。其中, 为 对应的标签。
注意:
- 对于回归任务,;
- 对于分类任务,,其中 为该数据集拥有的类别个数。
线性回归模型
我们先考虑一个样本 ,且 ,有
再考虑所有样本,有
下面我们来看看如何更新参数的?(最小化 )
1. 梯度下降
我们先求下梯度:
再更新参数:
其中, 被称为学习率或步长。
scikit-learn 的实现方式不是梯度下降法,而是最小二乘法。
2 最小二乘法
令 ,,则
由 可得最小二乘解
sklearn 实现
本文,利用 Kaggle 上数据集 USA_Housing 做线性回归任务来预测房价。
import pandas as pd
import numpy as np
name = '../dataset/USA_Housing.csv'
dataset = pd.read_csv(name)
train = dataset.iloc[:3000,:]
test = dataset.iloc[3000:,:]
print(train.shape)
print(test.shape)
(3000, 7)
(2000, 7)
查看有无缺失值:
print(np.unique(train.isnull().any()))
print(np.unique(test.isnull().any()))
[False]
[False]
dataset.columns # 查看所有特征名称
Index(['Avg. Area Income', 'Avg. Area House Age', 'Avg. Area Number of Rooms',
'Avg. Area Number of Bedrooms', 'Area Population', 'Price', 'Address'],
dtype='object')
我们不考虑 'Address'
特征。通过特征 'Avg. Area Income', 'Avg. Area House Age', 'Avg. Area Number of Rooms', 'Avg. Area Number of Bedrooms', 'Area Population'
来预测 'Price'
。
features_column = [
name for name in dataset.columns if name not in ['Price', 'Address']
]
label_column = ['Price']
x_train = train[features_column]
y_train = train[label_column]
x_test = test[features_column]
y_test = test[label_column]
训练线性模型
from sklearn import linear_model
regr = linear_model.LinearRegression()
regr.fit(x_train,y_train)
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None,
normalize=False)
预测:
pred_test = regr.predict(x_test)
print('预测:\n', pred_test)
预测:
[[1448272.69412661]
[1301968.70364148]
[1355317.66349181]
...
[1026886.81679043]
[1261208.34730572]
[1301748.28071761]]
计算损失:
from sklearn.metrics import mean_squared_error,r2_score
print('mean square error:', mean_squared_error(y_test,pred_test))
mean square error: 10305125663.199516
计算 r2_score:
print(r2_score(y_test,pred_test))
0.9174114106593986
关于如何使用梯度下降法实现,具体参考:线性回归模型的 MXNet 与 TensorFlow 实现。