一、线性回归

1、线性回归的作用

通过许多实验观察到的值回归统计变量的真实值。

2、线性回归的定义

线性回归属于有监督学习算法,描述一个连续型因变量和一系列自变量之间的关系。

二、线性回归四要素

1、数据

线性回归的数据即一系列自变量以及对应的因变量。

2、模型

普通形式:

 y=f(x)=w_{0}+w_{1}x_{1}+w_{2}x_{2}+......+w_{n}x_{n}

其中,y为预测的因变量,w为系数,x为自变量,n为自变量的个数。

矩阵形式:

  x^{i}=\begin{bmatrix} x_{1}^{i} & x_{2}^{i} & ...... & x_{n}^{i} \end{bmatrix}

X=\begin{bmatrix} x^{1}\\ x^{2}\\ ......\\ x^{m} \end{bmatrix}

w=\begin{bmatrix} w_{1}\\ w_{2}\\ ......\\ w_{n} \end{bmatrix}

y=Xw+w_{0}=\begin{bmatrix} x^{1}w+w_{0}\\ x^{2}w+w_{0}\\ ......\\ x^{m} w+w_{0}\end{bmatrix}

其中,m为数据的个数。

3、损失函数

 普通形式:

L(w)=\frac{1}{n}\sum_{i=1}^{n}(r_{i}-y_{i})^{2}

其中,r为因变量的真实值。

矩阵形式:

r=\begin{bmatrix} r^{1}\\ r^{2}\\ ......\\ r^{m} \end{bmatrix}

L(w)=\frac{1}{m}(r-y)^{T}(r-y)

4、优化算法

矩阵形式:

min_{w} L(w)

梯度下降:

 w^{t+1}=w^{t}-\eta \frac{\vartheta L(w)}{\vartheta w}

三、 线性回归实践(sklearn)

以kaggle中数据集“Student Performance (Multiple Linear Regression)”为例

1、数据准备

直接下载使用“Student Performance (Multiple Linear Regression)”数据集,读取数据

import pandas as pd

dataset = pd.read_csv('./Student_Performance.csv')  # 从当前目录下的Student_Performance.csv文件中读取数据

数据预处理,对数据进行虚拟编码,可以使得分类数据更好表示同时删除第一个类别可以避免共线性问题

dataset_encode = pd.get_dummies(dataset, prefix="Extracurricular Activities", prefix_sep='_',
                                columns=["Extracurricular Activities"],
                                drop_first=True)  # 对类别型变量"Extracurricular Activities"进行虚拟编码,同时删除第一个类别,避免共线性问题

 2、训练模型

Hold-out,即划分数据集为训练集和测试集

from sklearn.model_selection import train_test_split

X = dataset_encode.drop("Performance Index", axis=1)  # 删除"Performance Index"列,得到自变量X
y = dataset_encode["Performance Index"]  # 取"Performance Index"列,得到因变量y


X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3,
                                                    random_state=23)  # 将数据集划分为训练集和测试集,测试集占比为30%,随机种子为23,保证每次划分结果相同

训练模型

from sklearn.linear_model import LinearRegression

lin_reg = LinearRegression()  # 创建一个线性回归对象
lin_reg.fit(X_train, y_train)  # 使用训练集拟合线性回归模型

输出参数结果

params = ['theta' + str(i) for i in range(X_train.shape[1] + 1)]  # 定义参数名称列表
columns = ['intersect'] + list(X.columns.values)  # 定义对应变量名称列表
thetas = [lin_reg.intercept_] + list(lin_reg.coef_)  # 获取模型的参数值
data_frame = pd.DataFrame({'params': params, 'columns': columns, 'thetas': thetas})
print(data_frame)

结果如下:

   params                                           columns         thetas
0  theta0                                            intersect -33.961731
1  theta1                                   Hours Studied    2.850926
2  theta2                                Previous Scores    1.018645
3  theta3                                       Sleep Hours    0.467586
4  theta4   Sample Question Papers Practiced    0.189177
5  theta5             Extracurricular Activities_Yes    0.588272

3、评估模型

测试模型,使用均方差(MSE)进行测试

MSE=\frac{1}{n}\sum_{i=1}^{n}(r_{i}-\hat{y_{i}})^{2} 

from sklearn.metrics import mean_squared_error

y_predict = lin_reg.predict(X_test)  # 使用模型对测试集进行预测

MSE = mean_squared_error(y_test, y_predict)  # 计算预测值和真实值之间的均方误差MSE

评估模型,使用R^{2}评估模型,R^{2}是数据与拟合回归线的接近程度的统计度量。R^{2}越大表示该模型越能解释数据围绕均值的变异性。

SSE=\sum_{i=1}^{n}(r_{i}-\hat{y_{i}})^{2}

SST=\sum_{i=1}^{n}(r_{i}-\bar{y_{i}})^{2} 

R^{2}=1-\frac{SSE}{SST} 

R_square = lin_reg.score(X_test, y_test)  # 计算模型在测试集上的决定系数R^2

输出MSE和 R^{2}结果

print('MSE : {}\nR_square : {}\n'.format(MSE, R_square))

结果如下:

MSE : 3.995277681013032
R_square : 0.9889977346766988

绘图可视化预测值与真实值之间的关系

import matplotlib.pyplot as plt

plt.scatter(y_test, y_predict, s=5)
plt.xlabel('real value')
plt.ylabel('predict value')
plt.title('predict value vs. real value')

std_x = np.arange(10, 100, 0.1)
std_y = np.arange(10, 100, 0.1)
plt.plot(std_x, std_y, c='r')  # 绘制标准线

plt.show()

结果如下:

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐