线性回归---波士顿房价数据集(改)

本文探讨了在波士顿房价数据集上应用线性回归时如何进行特征选择。通过反向淘汰方法,设定显著性阈值为0.05,逐步剔除P值较高的特征,直至所有剩余特征的P值都低于阈值。文中详细介绍了反向淘汰的过程,并展示了剔除不同特征后的模型效果。最终,所有保留下来的特征的P值均小于显著水平,提高了模型的简洁性和准确性。
摘要由CSDN通过智能技术生成

这里我们用到了特征筛,为什么要进行特征进行选择?
在一个数据集中,我们需要找出对因变量影响显著的变量,对于显著性较低的我们进行剔除,留下显著性高的特征把它们加入模型,从而使我们的模型复杂度更低,更加的简洁,准确。

这篇文章使用反向淘汰的方法来进行此项工作

反向淘汰步骤:

  • 确定我们用来衡量显著性的一个阈值(决定取舍),这里我们取0.05
  • 将所有的特征ALL IN到模型进行训练
  • 计算出每个特征的P_value
  • 将P_value最高的且高于显著水平的阈值的特征从模型训练中剔除
  • 利用剩下的特征进行新一轮的拟合,如果存在P_value大于阈值,则返回4步,直到所有特征的P_value小于设定的阈值

关于P_value:
- p值是指在一个概率模型中,统计摘要(如两组样本均值差)与实际观测数据相同,或甚至更大这一事件发生的概率。换言之,是检验假设零假设成立或表现更严重的可能性。p值若与选定显著性水平(0.05或0.01)相比更小,则零假设会被否定而不可接受。然而这并不直接表明原假设正确。p值是一个服从正态分布的随机变量,在实际使用中因样本等各种因素存在不确定性。产生的结果可能会带来争议。
- 零假设(null hypothesis),统计学术语,又称原假设,指进行统计检验时预先建立的假设。 零假设成立时,有关统计量应服从已知的某种概率分布。
当统计量的计算值落入否定域时,可知发生了小概率事件,应否定原假设。


数据集说明:

CRIM:城镇人均犯罪率。
ZN:住宅用地超过 25000 sq.ft. 的比例。
INDUS:城镇非零售商用土地的比例。
CHAS:查理斯河空变量(如果边界是河流,则为1;否则为0)。
NOX:一氧化氮浓度。
RM:住宅平均房间数。
AGE:1940 年之前建成的自用房屋比例。
DIS:到波士顿五个中心区域的加权距离。
RAD:辐射性公路的接近指数。
TAX:每 10000 美元的全值财产税率。
PTRATIO:城镇师生比例。
B:1000(Bk-0.63)^ 2,其中 Bk 指代城镇中黑人的比例。
LSTAT:人口中地位低下者的比例。
MEDV:自住房的平均房价,以千美元计。

#导入用到的库
import sklearn.datasets as datasets
import pandas as pd
import numpy as np
#载入数据集
Boston = datasets.load_boston()
# print(B
  • 5
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
首先,我们需要准备数据集。这里我们使用sklearn中的波士顿房价数据集。代码如下: ```python from sklearn.datasets import load_boston import numpy as np data = load_boston() X = data["data"] y = data["target"] ``` 其中,`X`是13个特征的向量,`y`是相应的房价。下一步是对数据进行归一化处理,保证特征权重的一致性。 ```python from sklearn.preprocessing import StandardScaler scaler = StandardScaler() X = scaler.fit_transform(X) ``` 接下来,我们构建线性回归模型,使用梯度下降法进行训练。具体实现过程如下: ```python class LinearRegression: def __init__(self, alpha=0.01, iterations=1000): self.alpha = alpha # 学习率 self.iterations = iterations # 迭代次数 def fit(self, X, y): m, n = X.shape self.theta = np.zeros(n+1) # 初始化权重 X = np.insert(X, 0, 1, axis=1) # 添加截距项 for i in range(self.iterations): h = np.dot(X, self.theta) # 计算预测值 loss = h - y # 计算误差 gradient = np.dot(X.T, loss) / m # 计算梯度 self.theta -= self.alpha * gradient # 更新权重 def predict(self, X): X = np.insert(X, 0, 1, axis=1) # 添加截距项 return np.dot(X, self.theta) # 返回预测值 ``` 在以上代码中,`fit`方法用来训练模型,`predict`方法用来进行预测。使用该模型对波士顿房价数据进行训练和预测,代码如下: ```python from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) lr = LinearRegression(alpha=0.01, iterations=10000) lr.fit(X_train, y_train) y_pred = lr.predict(X_test) from sklearn.metrics import mean_squared_error print("Mean squared error: %.2f" % mean_squared_error(y_test, y_pred)) ``` 最终,我们可以得到预测结果的均方误差(Mean squared error)。通过不断调整学习率等超参数,就可以得到更好的模型预测效果。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值