1 # !/usr/bin/env python3
2 # -- coding: utf-8 --
3 “”"
4 Created on Sunday April 21 14:33:40 2021
5
6 @author: Xing-Rong Fan
7 “”"
8
9
10 # 基于sklearn的线性回归模型及应用
11 #
12 # sklearn.linear_model.LinearRegression(fit_intercept=True, normalize=False, copy_X=True, n_jobs=None)
13 #
14 # * https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html
15 # * https://cloud.tencent.com/developer/article/1581505
16 # * https://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html#
17 #
18
19 # 示例演示:sklearn.linear_model.LinearRegression
20 #
21 # 线性模型参数 a b <- y = ax+b
22
23
24 #导入模块#
25 import numpy as np # 导入numpy包
26 from sklearn.linear_model import LinearRegression # 导入线性回归模型模块
27 from sklearn.metrics import mean_squared_error, r2_score # 导入度量标准模块
28
29 #数据准备#
30 a = np.array([1, 2]) # (2,) # 自定义真实模型参数
31 b = 3
32 X = np.array([[1, 1], [1, 2], [2, 2], [2, 3]]) # 定义输入变量X
33 # y = a_0 * x_0 + a_1 * x_1 + b
34 y = np.dot(X, a) + b # 根据模型输出变量y
35
36 #配置模型#
37 lr = LinearRegression() # 创建线性回归模型
38 lr.fit(X, y) # 模型训练
39 [a_hat, b_hat]= [lr.coef_, lr.intercept_] # lr模型参数
40 print(‘lr斜率: a = ‘, a_hat)
41 print(‘lr截距:b = %.2f’ %b_hat)
42 y_pred = lr.predict(X) # 模型预测
43 print(‘预测结果:y_pred = ‘, y_pred)
44
45 #模型评估#
46 print(‘均方根误差: mse = %.2f’ % mean_squared_error(y, y_pred)) # The mean squared error
47 print(‘决定系数: r2 = %.2f’ % r2_score(y, y_pred)) # 等价于 r2 = lr.score(X, y)
48
49
50 # 基于线性回归模型的学生考试成绩预测
51 #
52 # Ref:https://zhuanlan.zhihu.com/p/42411866
53
54 #导入模块#
55 from collections import OrderedDict
56 import pandas as pd
57 import numpy as np
58
59 #数据准备#
60 examDict={
61 ‘学习时间’:[0.50,0.75,1.00,1.25,1.50,1.75,1.75,2.00,2.25,2.50,2.75,3.00,3.25,3.50,4.00,4.25,4.50,4.75,5.00,5.50],
62 ‘考试成绩’:[10,22,13,43,20,22,33,50,62,48,55,75,62,73,81,76,64,82,90,93]
63 }
64 examOrderDict = OrderedDict(examDict)
65 df = pd.DataFrame(examOrderDict)
66 df.head()
67
68
69 #特征工程#
70 exam_X = df.loc[:,‘学习时间’] # 特征features
71 exam_y = df.loc[:,‘考试成绩’] # 标签labels
72
73 import matplotlib.pyplot as plt
74 # 绘制散点图: 查看“学习时间”与“考试成绩”之间的关系
75 plt.scatter(exam_X, exam_y,color=‘b’,label=‘examination score’) # 散点图
76 plt.xlabel(“Hours”) # 添加图标横坐标标签
77 plt.ylabel(“Score”) # 添加图标纵坐标标签
78 plt.title(‘Score versus Hours’) # 添加图名
79 plt.legend(loc=‘upper left’) # 在左上角添加图例
80 plt.show() # 显示图像
81
82
83 # 思考:学习时间与考试成绩相关性如何?( )
84 #
85 # A 强相关;B 弱相关;C 不相关
86 #
87 # 能否基于线性回归模型,通过“学习时间”来预测“考试成绩”?
88
89 rDf = df.corr()
90 print(‘相关系数矩阵:’)
91 rDf
92
93 #数据划分#
94 from sklearn.model_selection import train_test_split
95 X_train,X_test,y_train,y_test = train_test_split(exam_X,exam_y,test_size=0.2,random_state=0) # 建立训练数据和测试数据
96 print(‘原始数据特征:’,exam_X.shape,’,训练数据特征:’,X_train.shape,’,测试数据特征:’,X_test.shape)
97 print(‘原始数据特征:’,exam_y.shape,’,训练数据特征:’,y_train.shape,’,测试数据特征:’,y_test.shape)
98
99 X_train = X_train.values.reshape(-1,1) # 将训练数据特征转换成二维数组XX行1列
100 X_test = X_test.values.reshape(-1,1) # 将测试数据特征转换成二维数组XX行1列
101
102 plt.scatter(X_train,y_train,color=‘b’,label=‘train data’)
103 plt.scatter(X_test,y_test,color=‘r’,label=‘test data’)
104 plt.xlabel(“Hours”) # 添加图标横坐标标签
105 plt.ylabel(“Score”) # 添加图标纵坐标标签
106 plt.title(‘Score versus Hours’) # 添加图名
107 plt.legend(loc=‘upper left’) # 在左上角添加图例
108 plt.show() # 显示图像
109
110
111 #配置模型#
112 #第1步:导入线性回归
113 from sklearn.linear_model import LinearRegression
114 #第2步:创建模型:线性回归
115 model = LinearRegression()
116 #第3步:训练模型
117 model.fit(X_train,y_train)
118
119 a = model.coef_ # 回归系数
120 b = model.intercept_ # 截距
121 print(‘最佳拟合线: 回归系数 a = %.2f’ %a, ‘, 截距 b = %.2f’%b)
122
123 plt.scatter(X_train,y_train,color=‘b’,label=‘train data’)
124 y_train_pred = model.predict(X_train) # 训练数据的预测值
125 plt.plot(X_train,y_train_pred,color=‘black’,linewidth=3,label=‘Fitted line’) # 绘制最佳拟合线
126 plt.xlabel(“Hours”) # 添加图标横坐标标签
127 plt.ylabel(“Score”) # 添加图标纵坐标标签
128 plt.title(‘Score versus Hours’) # 添加图名
129 plt.legend(loc=‘upper left’) # 在左上角添加图例
130 plt.show() # 显示图像
131
132
133 # 思考:最佳拟合线有何特点?
134 #
135 # A 尽可能多地穿过了训练数据点
136 #
137 # B 很好地反映了“学习时间”随“考试成绩”的变化趋势
138 #
139 # C 学习效果不好
140
141 #模型评估#
142 # 回归问题:决定系数R平方,反映预测值与真实值之间的拟合程度
143 print(‘决定系数:R2 = %.2f’ % model.score(X_test , y_test))
144
145 from sklearn.metrics import mean_squared_error, r2_score
146 y_test_pred = model.predict(X_test)
147 print(‘均方根误差: rmse = %.2f’ % np.sqrt(mean_squared_error(y_test, y_test_pred))) # The root mean squared error
148 print(‘决定系数: r2 = %.2f’ % r2_score(y_test, y_test_pred)) # 等价于 r2 = lr.score(X, y)
149
150 #结果可视化#
151 # 最佳拟合线、训练数据集以及测试数据集显示在一张图上
152 plt.scatter(X_train,y_train,color=‘b’,label=‘train data’) # 训练数据散点图
153 plt.scatter(X_test, y_test, color=‘red’, label=“test data”) # 测试数据散点图
154 y_train_pred = model.predict(X_train) # 训练数据的预测值
155 plt.plot(X_train,y_train_pred,color=‘black’,linewidth=3,label=‘Fitted line’) # 绘制最佳拟合线
156 plt.xlabel(“Hours”) # 添加图标横坐标标签
157 plt.ylabel(“Score”) # 添加图标纵坐标标签
158 plt.title(‘Score versus Hours’) # 添加图名
159 plt.legend(loc=‘upper left’) # 在左上角添加图例
160 plt.show() # 显示图像
161
162
163 # 应用:AI考试成绩预测
164
165 x = float(input(‘本课程你复习时长(学习时间)是多少小时?(0-{0})\n’.format(np.round((100-model.intercept_)/model.coef_,2))))
166
167 print(‘AI预测你的课程考试成绩为%.2f’ % model.predict(np.array(x).reshape(-1,1)))
168 # print(‘AI预测你的课程考试成绩为%.2f’ % model.predict([[x]]))
09-25
2万+
09-16
1万+