预测分析身高与体重
是否存在线性关系?
程序
#导入模块
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
from sklearn.linear_model import LinearRegression
mpl.rcParams['font.family'] = 'SimHei'
mpl.rcParams['axes.unicode_minus'] = False
# 定义一个函数
# 设置画板
# 设置x和y轴的说明
# 设置x是 0到2 y
# 显示网格
#显示数据
def runplt():
plt.figure()
plt.title('身高与体重一元关系',fontproperties=font)
plt.xlabel('身高(米)',fontproperties=font)
plt.ylabel('体重(公斤)',fontproperties=font)
plt.axis([0,2,0,85],fontproperties=font)
plt.grid(True)
return plt
#输入训练数据
X=[[0.86],[0.96],[1.12],[1.35],[1.55],[1.63],[1.71],[1.78]]
y = [[12],[15],[20],[35],[48],[51],[59],[66]]
# 显示一下数据
plt = runplt()
plt.plot(X,y,'k.')
plt.show()
# 观察出是线性关系
# 所以可以建立回归模型,利用sklearn里面的fit和predict
# fit用来分析模型参数
# predict用来预测
#创建模型
lr = LinearRegression()
# 然后将训练集放到模型中
lr.fit(X, y)
# 预测
print('预测身高为1.67m的体重是:%2.f公斤'%lr.predict(np.array([1.67]).reshape(-1, 1)))
#使用测试数据真题对该模型进行预测
X2 = [[0.75],[1.08],[1.26],[1.51],[1.6],[1.85]]
y2 = lr.predict(X2)
plt.plot(X,y,'k.')
plt.plot(X2, y2, 'g-')
# # 残差预测值
yr = lr.predict(X)
for idx, x in enumerate(X):
plt.plot([x, x], [y[idx], yr[idx]], 'r-')
plt.show()
# 模型打分 R^2
X_test = [[0.75],[1.08],[1.26],[1.51],[1.6],[1.85]]
y_test = [[10],[17],[27],[41],[50],[75]]
r2 = lr.score(X_test, y_test)
print('R^2=%.2f'%r2)
预测身高为1.67m的体重是:56公斤
R^2=0.93
注意:
2. 预测学生成绩
# 一元线性回归
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams['font.family'] = 'SimHei'
mpl.rcParams['axes.unicode_minus'] = False
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
import pandas as pd
# 官方文档
# skitlearn
# https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html#sklearn.linear_model.LinearRegression
# matplotlib
# https://matplotlib.org/api/_as_gen/matplotlib.pyplot.scatter.html#matplotlib.pyplot.scatter
# 思路
# 使用matplotlib.pyplot库作图,将结果可视化。
#这里主要用到库中的scatter()函数和plot()函数,其中scatter()画散点图,plot()画经过点的线
# 我们使用sklearn.linear_model.LinearRegression类来训练模型。
#首先创建该类的对象regressor,然后使用该类的fit()方法对数据集进行训练。
3. 预测房价
# 1. 数据预处理
dataset = pd.read_csv('studentscores.csv')
# dataset
# 观察数据集可以发现,我们不需要处理缺失值和进行特征缩放。
X = dataset.iloc[:,:1].values # 设么意思?和直接填0有什么区别?
# X
Y = dataset.iloc[:,1].values
# Y
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=0)
# 2. 训练模型
regressor = LinearRegression()
regressor = regressor.fit(X_train, Y_train)
# 3. 预测结果
Y_pred = regressor.predict(X_test)
# 4. 可是化
# 训练集结果可视化
plt.scatter(X_train, Y_train, color = 'red')
plt.plot(X_train, regressor.predict(X_train), color = 'blue')
# plt.show()
# 测试集结果可视化
plt.scatter(X_test, Y_test, color = 'red')
plt.plot(X_test, regressor.predict(X_test), color = 'blue')
plt.show()
Y_pred
# 导入模块
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.linear_model import LinearRegression
# 输入文件,将房间大小和价格的数据转成scikitlearn中LinearRegression模型识别的数据
def get_data(file_name):
data = pd.read_csv(file_name)
X_parameter = []
Y_parameter = []
for single_square_meter, single_price_value in zip(data['square_meter'], data['price']):
X_parameter.append([float(single_square_meter)])
Y_parameter.append([float(single_price_value)])
return X_parameter, Y_parameter
# 线性分析
def line_model_main(X_parameter, Y_parameter, predict_square_meter):
# 模型对象
regr = LinearRegression()
# 训练模型
regr.fit(X_parameter, Y_parameter)
# 预测数据
predict_outcome = regr.predict(predict_square_meter)
predictions = {}
# 截距值
predictions['intercept'] = regr.intercept_
# 斜率值
predictions['coefficient'] = regr.coef_
# 预测值
predictions['predict_value'] = predict_outcome
return predictions
# 显示图像
def show_linear_line(X_parameter, Y_parameter):
# 构造模型对象
regr = LinearRegression()
# 训练模型
regr.fit(X_parameter, Y_parameter)
# 绘制已知数据的散点图
plt.scatter(X_parameter, Y_parameter, color='blue')
# 绘制预测直线
plt.plot(X_parameter, regr.predict(X_parameter), color='red', linewidth=4)
plt.title('Predict the house price')
plt.xlabel('square meter')
plt.ylabel('price')
plt.show()
# 主函数
def main():
#读取数据
X,Y = get_data('./house_price.csv')
#获取预测值,这里我们预测700平英尺的房子的房价
predict_square_meter = 700
result = line_model_main(X,Y,predict_square_meter)
for key,value in result.items():
print('{0}:{1}'.format(key,value))
#绘图
show_linear_line(X,Y)
if __name__ == '__main__':
main()