赞
踩
通过许多实验观察到的值回归统计变量的真实值。
线性回归属于有监督学习算法,描述一个连续型因变量和一系列自变量之间的关系。
线性回归的数据即一系列自变量以及对应的因变量。
普通形式:
其中,y为预测的因变量,w为系数,x为自变量,n为自变量的个数。
矩阵形式:
其中,m为数据的个数。
普通形式:
其中,r为因变量的真实值。
矩阵形式:
矩阵形式:
梯度下降:
以kaggle中数据集“Student Performance (Multiple Linear Regression)”为例
直接下载使用“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"进行虚拟编码,同时删除第一个类别,避免共线性问题
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
测试模型,使用均方差(MSE)进行测试
- from sklearn.metrics import mean_squared_error
-
- y_predict = lin_reg.predict(X_test) # 使用模型对测试集进行预测
-
- MSE = mean_squared_error(y_test, y_predict) # 计算预测值和真实值之间的均方误差MSE
评估模型,使用评估模型,是数据与拟合回归线的接近程度的统计度量。越大表示该模型越能解释数据围绕均值的变异性。
R_square = lin_reg.score(X_test, y_test) # 计算模型在测试集上的决定系数R^2
输出MSE和 结果
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()
结果如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。