/LinearRegression

线性回归

Primary LanguagePython

线性回归

sklearn内置的波士顿房屋数据集做一下房价预测,练习线性回归的API。

  • 正规方程法
  • 梯度下降法
  • 岭回归

获取数据集

加载sklearnboston数据集,返回训练集、测试集、以及目标值标准化模型。

线性回归求目标值是对各特征加和,因此需要对数据做标准化处理。

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万条样本以下。 对于大数据集则建议使用梯度下降。 而岭回归加入了正则化,稳定性更好。