多因子线性回归实战

线性回归理论知识(个人觉得讲得最好的,没有之一)

通俗统计学原理入门27 线性相关 线性相关系数 协方差 简单一元线性回归_哔哩哔哩_bilibili


通俗统计学原理入门 28 线性回归 找到那条直线 回归直线 最优拟合直线 最小二乘法 梯度下降算法 损失函数 权重 偏置_哔哩哔哩_bilibili

任务

线性回归预测房价:9.9 多因子线性回归实战_哔哩哔哩_bilibili
基于 usa_housing_price.csv 数据,建立线性回归模型,预测合理房价:
1、以面积为输入变量,建立单因子模型,评估模型表现,可视化线性回归预测结果
2、以 income、house age、numbers of rooms、population、area 为输入变量,建立多因子模型,评估模型表现
3、预测 Income=65000,House Age=5,Number of Rooms=5,Population=30000,size=200 的合理房价

数据

usa_housing_price.csv    【百度网盘下载,提取码: 8497】

代码

# load the data
import pandas as pd
import numpy as np
data = pd.read_csv('usa_housing_price.csv')
data.head()

数据探查

# # 数据探查:可视化
%matplotlib inline
from matplotlib import pyplot as plt
fig = plt.figure(figsize = (10,10))
# 收入 与 价格 散点图
fig1 = plt.subplot(231) #   2 行 3 列的图形,画第 1 副图
plt.scatter(data.loc[:,'Avg. Area Income'], data.loc[:,'Price']) # x = ‘Avg.Area Income’ 列 ,y  = 'Price'列
plt.title('Price VS Income')
# 房屋年龄 与 价格 散点图
fig2 = plt.subplot(232) #   2 行 3 列的图形,画第 2 副图
plt.scatter(data.loc[:,'Avg. Area House Age'], data.loc[:,'Price']) # x = ‘Avg.Area Income’ 列 ,y  = 'Price'列
plt.title('Price VS House Age')
# 房间个数 与 价格 散点图
fig3 = plt.subplot(233) #   2 行 3 列的图形,画第 3 副图
plt.scatter(data.loc[:,'Avg. Area Number of Rooms'], data.loc[:,'Price']) # x = ‘Avg.Area Income’ 列 ,y  = 'Price'列
plt.title('Price VS Number of Rooms')
# 人口数量 与 价格 散点图
fig4 = plt.subplot(234) #   2 行 3 列的图形,画第 4 副图
plt.scatter(data.loc[:,'Area Population'], data.loc[:,'Price']) # x = ‘Avg.Area Income’ 列 ,y  = 'Price'列
plt.title('Price VS Area Populations')
# 面积 与 价格 散点图
fig5 = plt.subplot(235) #   2 行 3 列的图形,画第 5 副图
plt.scatter(data.loc[:,'size'], data.loc[:,'Price']) # x = ‘Avg.Area Income’ 列 ,y  = 'Price'列
plt.title('Price VS size')
plt.show()

任务1、以面积为输入变量,建立单因子模型,评估模型表现,可视化线性回归预测结果

#任务1、以面积为输入变量,建立单因子模型,评估模型表现,可视化线性回归预测结果
#define X and Y
X = data.loc[:,'size']
y = data.loc[:,'Price']
# X.head()
# y.head()
#模型训练需要二维数据,所以要进维度转换
X = np.array(X).reshape(-1,1)  #   对X进行维度转换
print(X.shape)
# set up the linear regression model
from sklearn.linear_model import LinearRegression
LR1 = LinearRegression() # 使用默认参数创建模型
# train the model
LR1.fit(X, y)  # LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None, normalize=False)
# calculate the price vs size
y_predict_1 = LR1.predict(X) # 进行预测
print(y_predict_1)
# evaluate the model
from sklearn.metrics import mean_squared_error, r2_score
mean_squared_error_1 = mean_squared_error(y,y_pridict_1) # 两个参数:y 实际值 、y 预测值
r2_score_1 = r2_score(y,y_pridict_1)
print(mean_squared_error_1, r2_score_1)  # 108771672553.6264 0.1275031240418234
# R2 分数越接近 1 越好

 mean_squared_error_1  和  r2_score:

#把图画出来看
fig6 = plt.figure(figsize = (8,5))
plt.scatter(X,y) # 把原始数据画出来 
plt.plot(X,y_predict_1,'r')#把这条回归直线也画出来
plt.show() 
# 从图形可以看出,面积 和价格的关系图中,价格范围很广,也就是说,价格可能跟面积以外的其它因素有有关系

任务2、以 income、house age、numbers of rooms、population、area 为输入变量,建立多因子模型,评估模型表现

# 任务2、以 income、house age、numbers of rooms、population、area 为输入变量,建立多因子模型,评估模型表现
# define X_multi
X_multi = data.drop(['Price'], axis =1) # dataframe 去掉某列 
X_multi.head()

# set up 2nd linear model
LR_multi = LinearRegression()
#train the model
LR_multi.fit(X_multi,y) #模型训练
# make prediction
y_predict_multi = LR_multi.predict(X_multi)
print(y_predict_multi) # 看不出预测的好不好
#模型评估
mean_squared_error_multi = mean_squared_error(y,y_predict_multi) # 两个参数:y 实际值 、y 预测值
r2_score_multi = r2_score(y, y_predict_multi)
print(mean_squared_error_multi, r2_score_multi) # r2_score_multi=0.9180229195220739, 与 1 很接近了
#上面单因子里 r2_score_1 = 0.1275031240418234
#可视化
fig7 = plt.figure(figsize=(8,5))
plt.scatter(y,y_predict_multi)  # 把实际y 值  和 预测 y 值画成 散点图,如果能集中在一条直线上,说明模型还不错
plt.show() # 从下图可以看出,集中度还是不错的

​  

#展示单因子图,与上面多因子图进行对比
fig8 = plt.figure(figsize = (8,5))
plt.scatter(y, y_predict_1)
plt.show() # 通过对比可以看出,多因子的图集中度比下面单因子的要好很多,单因子很离散(预测值和实际值差很多)

任务3、预测 Income=65000,House Age=5,Number of Rooms=5,Population=30000,size=200 的合理房价

#任务3、预测 Income=65000,House Age=5,Number of Rooms=5,Population=30000,size=200 的合理房价
X_test = [65000,5,5,30000,200]
X_test = np.array(X_test).reshape(1,-1)
print(X_test) # [[65000     5     5 30000   200]]
y_test_predict = LR_multi.predict(X_test)
print(y_test_predict) # [817052.19516298]

线性回归房价实战 summary


通过搭建线性回归模型,实现单因子的房屋价格预测;
在单因子模型效果不好的情况下,通过考虑更多的因子,建立了多因子模型;
多因子模型达到了更好的预测效果,r2 分数为 0.91;
实现了预测结果的可视化,直观对比预测价格与实际价格的差异。

### 多因子线性规划求解方法 #### 定义与概述 多因子线性规划是一种优化技术,用于在满足一组约束条件下最大化或最小化目标函数。当存在多个影响决策的因素时,这些因素通常被表示为目标函数中的变量和系数。 #### 数学模型构建 建立一个多因子线性规划问题的第一步是定义决策变量、目标函数以及约束条件。假设有一个包含n个决策变量\(x_1,x_2,...,x_n\)的问题,其一般形式可描述为: - **目标函数**: \(Z=c_1x_1+c_2x_2+\cdots+c_nx_n\) 这里的目标可能是最大值也可能是最小值取决于具体应用场景。 - **约束条件**: \[a_{i1}x_1+a_{i2}x_2+\ldots+a_{in}x_n \leq b_i,\quad i=1,2,\dots,m.\] 其中不等号也可以根据实际情况调整成等于(\(=\))或者大于等于(\(\geqslant\))[^1]。 对于某些特定场景下还可能存在额外的边界限制比如非负性要求即\(x_j≥0,j∈{1,…,n}\)。 #### 解决方案介绍 针对此类复杂度较高的线性规划问题,常用的方法有单纯形法(Simplex Method),内点算法(Interior Point Methods)以及其他高级数值计算手段。Python中有专门库如`scipy.optimize.linprog()`可以直接调用来简化编程工作量并获得精确的结果[^2]。 下面给出一段简单的Python代码片段展示如何利用SciPy包解决一个具体的双因子线性规划案例: ```python from scipy.optimize import linprog c = [-1, 4] # 目标函数系数向量(这里设定了最小化) A = [[-3, 1], [1, 2]] # 不等式左侧矩阵 b = [6, 4] # 右侧常数项向量 x0_bounds = (None, None) x1_bounds = (-3, None) res = linprog(c, A_ub=A, b_ub=b, bounds=[x0_bounds, x1_bounds], options={"disp": True}) print(res) ``` 这段脚本实现了对给定参数下的最优解搜索过程,并打印出最终结果。注意这里的设置是为了找到使目标函数取极小值的一组可行解;如果希望得到极大值,则需相应改变符号[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值