2021-09-09

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]]))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用python中的pymsql完成如下:表结构与数据创建 1. 建立 `users` 表和 `orders` 表。 `users` 表有用户ID、用户名、年龄字段,(id,name,age) `orders` 表有订单ID、订单日期、订单金额,用户id字段。(id,order_date,amount,user_id) 2 两表的id作为主键,`orders` 表用户id为users的外键 3 插入数据 `users` (1, '张三', 18), (2, '李四', 20), (3, '王五', 22), (4, '赵六', 25), (5, '钱七', 28); `orders` (1, '2021-09-01', 500, 1), (2, '2021-09-02', 1000, 2), (3, '2021-09-03', 600, 3), (4, '2021-09-04', 800, 4), (5, '2021-09-05', 1500, 5), (6, '2021-09-06', 1200, 3), (7, '2021-09-07', 2000, 1), (8, '2021-09-08', 300, 2), (9, '2021-09-09', 700, 5), (10, '2021-09-10', 900, 4); 查询语句 1. 查询订单总金额 2. 查询所有用户的平均年龄,并将结果四舍五入保留两位小数。 3. 查询订单总数最多的用户的姓名和订单总数。 4. 查询所有不重复的年龄。 5. 查询订单日期在2021年9月1日至9月4日之间的订单总金额。 6. 查询年龄不大于25岁的用户的订单数量,并按照降序排序。 7. 查询订单总金额排名前3的用户的姓名和订单总金额。 8. 查询订单总金额最大的用户的姓名和订单总金额。 9. 查询订单总金额最小的用户的姓名和订单总金额。 10. 查询所有名字中含有“李”的用户,按照名字升序排序。 11. 查询所有年龄大于20岁的用户,按照年龄降序排序,并只显示前5条记录。 12. 查询每个用户的订单数量和订单总金额,并按照总金额降序排序。
06-03
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值