一元线性回归是描述两个变量之间的相关关系最简单的模型。
根据两个变量之间的相关关系,拟合出一条直线来预测因变量变化的轨迹。
下面通过自己模拟的一些数据都进行模型预测
预测值的轨迹
import pandas as pd
import numpy as np
import random
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression as LR
# 获取数据
def get_data():
# 模拟线性关系的数据
a = [random.choice(np.arange(10,15)) for i in np.arange(100)]
b = [random.choice(np.arange(-20,20)) for i in np.arange(100)]
x = [i for i in np.arange(100)]
y = [i[0]*i[1]+i[2] for i in zip(a,x,b)]
x = pd.DataFrame(x, columns=['x'])
y = pd.DataFrame(y, columns=['y'])
return x, y
# 绘制预测轨迹及真实数据散点图
def show_predict(x, y):
# 构建模型
lr = LR()
lr.fit(x, y)
# 预测轨迹
y_pred = lr.predict(x)
# 绘制图像
plt.figure(figsize=(8,6))
plt.scatter(x, y)
plt.scatter(x, y_pred, c='r')
plt.xlabel('x')
plt.ylabel('y')
plt.show()
def main():
X, Y = get_data()
show_predict(X, Y)
if __name__ == '__main__':
main()
从图像来看,预测值的误差随x的增大而增大。
给定x的值预测y
import pandas as pd
import numpy as np
import random
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression as LR
from sklearn.model_selection import train_test_split as tts
# 获取数据
def get_data():
# 模拟线性关系的数据
a = [random.choice(np.arange(10,15)) for i in np.arange(100)]
b = [random.choice(np.arange(-20,20)) for i in np.arange(100)]
x = [i for i in np.arange(100)]
y = [i[0]*i[1]+i[2] for i in zip(a,x,b)]
x = pd.DataFrame(x, columns=['x'])
y = pd.DataFrame(y, columns=['y'])
return x, y
# 构造模型获取预测值
def linear_model_main(x, y, x_pred):
# 构造回归模型对象
lr = LR()
lr.fit(x, y)
# 预测
predict_value = lr.predict([x_pred])
return predict_value
# 画出图像,查看拟合程度
def show_linear_model(x, y):
# 构造回归模型对象
lr = LR()
lr.fit(x, y)
# 构建训练集和测试集
x_train, x_test, y_train, y_test = tts(x, y)
# 得到预测值并进行图像展示
y_pred = lr.predict(x_test)
plt.plot(range(x_test.shape[0]), y_test, ls='-.', c='b')
plt.plot(range(x_test.shape[0]), y_pred, ls='--', c='r')
plt.xlabel('x')
plt.ylabel('y')
plt.show()
def main():
# 获取数据
X, Y = get_data()
#
x_predict_value = 200
# 获取预测值
y_predict_value = linear_model_main(X, Y, [x_predict_value])
# 输出预测到的值,保留2位小数
print('y_predict_value={}'.format('%.2f'%y_predict_value[0][0]))
# 绘制对比图像
show_linear_model(X, Y)
if __name__ == '__main__':
main()
输出结果:
y_predict_value=2366.31