普通线性回归

Reads: 922 Edit

1 数据说明

我们以sklearn自带的数据集boston为例来预测波士顿房价的变动。

2 导入所需模块

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.metrics import mean_squared_error
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
import seaborn as sns    

3 查看数据的结构

# 波士顿房价数据获取
boston = datasets.load_boston()
print("特征变量的维度: ", boston.data.shape)
print("特征变量的名字: ", boston.feature_names)
print("目标变量的长度: ", boston.target.shape)

特征变量的维度: (506, 13)
特征变量的名字: ['CRIM' 'ZN' 'INDUS' 'CHAS' 'NOX' 'RM' 'AGE' 'DIS' 'RAD' 'TAX' 'PTRATIO' 'B' 'LSTAT']
目标变量的长度: (506,)

data =pd.DataFrame(data=boston.data, columns=boston.feature_names)
data.insert(0,column='houseprice',value=boston.target)
print(data) 
data.to_csv('./boston.csv', index=None)  # 可以把数据保存到本地

pyt-116

4 读取数据并划分为训练样本和测试样本

# 将数据分成特征变量和目标变量
X, y = datasets.load_boston(return_X_y=True)
# 将数据分成训练样本和测试样本
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0, test_size=0.7)

5 模型训练

# 训练模型
lr = LinearRegression().fit(X_train, y_train)

6 模型评价

# 获得训练模型的参数
feature_names = boston.feature_names
coefs = pd.DataFrame(
    lr.coef_,
    columns=["系数"],
    index=feature_names,
)
print("模型的系数:")
print(coefs)
print("模型的截距项为: \n", lr.intercept_)

pyt-116-1

# 变量的重要性图
coefs_std = pd.DataFrame(
    lr.coef_ * X_train.std(axis=0),
    columns=["变量重要性"],
    index=feature_names,
)
coefs_std.plot(kind="barh", figsize=(9, 7))
plt.rcParams['font.sans-serif'] = ['SimHei']        # 解决中文显示乱码问题!
plt.rc('axes', unicode_minus=False)                 # 解决坐标轴负号显示乱码问题!
plt.xlabel("标准化系数")
plt.title("普通线性回归")
plt.axvline(x=0, color=".5")
plt.subplots_adjust(left=0.3)
plt.show()

pyt-117

# 获得模型预测值,计算误差与可决系数
y_train_pred = lr.predict(X_train)
print("训练样本集均方误差: %.2f" % mean_squared_error(y_train, y_train_pred))
print("训练样本集可决系数: %.2f" % lr.score(X_train, y_train))

训练样本集均方误差: 20.84
训练样本集可决系数: 0.79

y_test_pred = lr.predict(X_test)
print("测试样本集均方误差: %.2f" % mean_squared_error(y_test, y_test_pred))
print("测试样本集可决系数: %.2f" % lr.score(X_test, y_test))

测试样本集均方误差: 25.92
测试样本集可决系数: 0.67

# 绘制估值值与实际值的相关图
fig, ax = plt.subplots(figsize=(5, 5))
plt.scatter(y_test, y_test_pred)
ax.plot([0, 1], [0, 1], transform=ax.transAxes, ls="--", c="red")
plt.title("普通线性回归")
plt.ylabel("预测值")
plt.xlabel("真实值")
plt.xlim([0, 27])
_ = plt.ylim([0, 27])
plt.show()

pyt-118

7 进一步分析:共线性问题讨论

普通线性回归模型中,特征变量之间可能会存在共线性问题,导致模型系数的实际意义解释困难。最简单的方法就是绘制变量之间的相关图,找出相关性比较高的变量然后手动去除重新估计模型!

本例中由于特征变量太多,所以仅演示绘制前4个特征变量以及1个目标变量共5个变量的相关图。

# 进一步分析,绘制变量相关图
_ = sns.pairplot(data.iloc[:, 0:5], kind="reg", diag_kind="kde")
plt.show()

pyt-119

最后,岭回归和lasso回归可以较好的处理特征变量的相关性问题。我们将在后面演示!



获取案例数据和源代码,请关注微信公众号并回复:Python_dt15


Comments

Make a comment