预测分析身高与体重

线性回归 身高体重 数据集下载_身高与体重


是否存在线性关系?

程序

#导入模块
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)

线性回归 身高体重 数据集下载_预测成绩_02


预测身高为1.67m的体重是:56公斤

线性回归 身高体重 数据集下载_预测成绩_03


R^2=0.93

注意:

线性回归 身高体重 数据集下载_身高与体重_04

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

线性回归 身高体重 数据集下载_一元线性回归_05

# 导入模块
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()

线性回归 身高体重 数据集下载_身高与体重_06