基于Python Statsmodels实现波士顿数据集单变量线性回归求助
分步指导:完成波士顿数据集单变量线性回归评估任务
嘿,我明白你Python基础薄弱但要完成这个评估的需求,下面我会一步步把每个环节讲清楚,尽量直白易懂:
1. 先搞定Vim的基础操作
因为你需要用Vim写代码,先把这个操作捋顺:
- 打开终端,输入
vim boston_regression.py创建并打开代码文件 - 按下
i键进入插入模式,这时候就能开始写代码了 - 写完代码后,按
Esc键退出插入模式,输入:wq回车,就能保存并退出Vim(:w是保存,:q是退出,合起来就是保存退出) - 运行代码的话,在终端输入
python3 boston_regression.py就行
2. 完整代码+逐段解释
我把整个任务的代码拆成模块,每个模块都给你讲清楚为什么这么写:
模块1:加载波士顿数据集
# 导入需要的库 from sklearn.datasets import load_boston import pandas as pd import statsmodels.api as sm # 加载数据集 boston = load_boston() # 把数据集转成DataFrame表格格式,方便查看和处理 dataset = pd.DataFrame(boston.data, columns=boston.feature_names) # 把目标变量(房价)添加到表格里 dataset['target'] = boston.target # 打印前5行数据,确认数据加载成功 print("数据集前5行预览:") print(dataset.head())
解释:
load_boston()是sklearn提供的加载波士顿房价数据集的方法pd.DataFrame把原始的数组数据转成我们更熟悉的表格形式,columns=boston.feature_names给每一列加上特征名称(比如RM代表平均房间数)- 最后用
head()打印前5行,能快速确认数据有没有加载对
模块2:拟合单变量线性回归模型
# 提取自变量RM(平均房间数)和因变量target(房价) X = dataset['RM'] y = dataset['target'] # 重点:statsmodels的OLS模型默认不包含截距项,所以必须手动给自变量加常数项 # 加完之后X会变成两列:const(截距)和RM X = sm.add_constant(X) # 创建OLS模型并拟合数据 model = sm.OLS(y, X).fit() # 输出模型的系数(截距和RM的系数) print("\n模型系数:") print(model.params) # 输出完整的模型统计摘要,这是评估模型的关键内容 print("\n模型详细统计摘要:") print(model.summary())
解释:
- 我们要做的是“房价(target)”和“平均房间数(RM)”的单变量回归,所以先把这两列单独提出来
- 为什么要加
sm.add_constant(X)?因为线性回归的公式是y = a + b*RM,其中a是截距,statsmodels默认不会自动加入这个截距项,所以必须手动添加 sm.OLS(y, X).fit()是创建普通最小二乘模型并拟合我们的数据model.params直接输出模型的两个系数:截距(const)和RM的系数,你能直接看到每增加一个房间,房价平均变化多少model.summary()会输出完整的统计结果,里面的关键指标比如R-squared(越接近1拟合效果越好)、P值(小于0.05说明RM对房价有显著影响)都能帮你评估模型
3. 特殊情况处理(如果加载数据集报错)
如果你运行load_boston()时报错,是因为sklearn新版本出于伦理问题移除了这个数据集,你可以用下面的替代代码加载原始数据:
# 替代加载方案 import pandas as pd import numpy as np data_url = "http://lib.stat.cmu.edu/datasets/boston" raw_df = pd.read_csv(data_url, sep="\s+", skiprows=22, header=None) dataset = pd.DataFrame(np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]])) dataset.columns = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'target']
这段代码和原来的load_boston()效果完全一样,只是直接从数据集的原始来源加载。
内容的提问来源于stack exchange,提问作者user9184557
相关产品推荐
相关产品推荐

