ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

20210515 波士顿房价数据集的处理

2021-05-15 15:01:19  阅读:239  来源: 互联网

标签:sklearn 房价 boston train 20210515 score import 波士顿 lasso


1-1
# 波士顿房价数据集的处理
import pandas as pd
import numpy as np
from sklearn.datasets import load_boston

boston = load_boston()
boston.data.shape
boston.data
1-2-1
import pandas as pd
import numpy as np
from sklearn.datasets import load_boston

boston = load_boston()
# 用 pandas 库将数据集整理成规则的形式
df = pd.DataFrame(boston.data,columns=boston.feature_names)
print(df.head())
1-2-2
import pandas as pd
import numpy as np
from sklearn.datasets import load_boston

boston = load_boston()
df = pd.DataFrame(boston.data,columns=boston.feature_names)
boston.target
1-3
# 用 statsmodels 库做线性回归
import pandas as pd
import numpy as np
from sklearn.datasets import load_boston
import statsmodels.api as sm

boston = load_boston()
model = sm.OLS(boston.target, boston.data)
results = model.fit()
print(results.summary)

data2 = boston.data[:,results.pvalues < 0.05]
model2 = sm.OLS(boston.target, data2)
results2 = model2.fit()
print(results2.summary)

data3 = data2[:,results2.pvalues<0.001]
model3 = sm.OLS(boston.target,data3)
results3 = model3.fit()
print(results3.summary())
# 可以看到里面的 t测试,F测试,AIC BIC P值等信息
# 可以通过P值进行判断筛选,P值小的不被需要;就可以筛选出更小的模型
print(results3.tvalues)
1-3-1
data4 = data3[:,np.abs(results3.tvalues) > 10]
model4 = sm.OLS(boston.target,data4)
results4 = model4.fit()
print(results4.summary())
2-1
# 使用 sklearn 将数据的训练集和测试集分开
from sklearn.model_selection import train_test_split
from sklearn import linear_model
x = boston.data
y = boston.target
# test_size = 0.33,测试部分占 33.33%,random_state 是随机种子
X_train, X_test, y_train, y_test = train_test_split(x,y,test_size = 0.33, random_state=42)
# Ir是定义的线性回归模型
Ir = linear_model.LinearRegression()
# Ir.fit是做拟合
Ir.fit(X_train,y_train)
# Ir.predict是对X的测试集进行推测;结果是预测的放假和真实房价y_test的关系
Ir.predict(X_test)
3-1
# Ridge 和 Lasso 的正则化,alpha 是正则化的强度
# 方式和线性拟合是一样的
ridge = linear_model.Ridge(alpha=1.0)
ridge.fit(X_train,y_train)
lasso = linear_model.Lasso(alpha=1.0)
lasso.fit(X_train,y_train)
lasso.predict(X_test)  # 打印会得到很多数据,数据是对 X 测试集 的预测
# 这些预测值可以用来计算和真实值的差距,可以通过调整 alpha 查看相差程度
3-2
# 如果想对模型进行挑选,可以用 cross_val_score 也就是交叉验证的分数
# cv 是交叉验证的个数
from sklearn.model_selection import cross_val_score

Ir_score = cross_val_score(Ir,x,y,cv=10)
ridge_score = cross_val_score(ridge,x,y,cv=10)
lasso_score = cross_val_score(lasso,x,y,cv=10)

print(Ir_score.mean(),Ir_score.std())
print(ridge_score.mean(),ridge_score.std())
print(lasso_score.mean(),lasso_score.std())
-->
0.20252899006056194 0.5952960169512286
0.2561668703759346 0.5211946351515252
0.19828974626177534 0.3335592209858715
# 可以看到,平均值中 lasso 是最低的,但是它的标准差也会小很多
3-3
# 经过调整,可以得到最佳的正则化的参数
# 这个例子显示了看到正则化路径的过程
# lasso_path 正则化路径,elastic net 弹性网络是 lasso 和 ridge的结合
# 惩罚时,同时惩罚 L1 和 L2的距离
# enet_path 是
from itertools import cycle
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import lasso_path, enet_path
from sklearn import datasets

diabetes = datasets.load_diabetes()     # 使用的是糖尿病的数据
x = diabetes.data
y = diabetes.target
# 正规化,把数据除以标准差,让数据尽可能的在 -1 到 1 之间
x /= x.std(axis=0)                 

eps = 5e-3  # the smaller it is the longer is the path

print("Computing regularization path using the lasso...")
alphas_lasso, coefs_lasso, _ = lasso_path(X, y, eps, fit_intercept=False)

print("Computing regularization path using the elastic net...")
alphas_enet, coefs_enet, _ = enet_path(
    X, y, eps=eps, l1_ratio=0.8, fit_intercept=False)

# Display results
ax = plt.gca()

colors = cycle(['b', 'r', 'g', 'c', 'k'])
neg_log_alphas_lasso = -np.log10(alphas_lasso)
neg_log_alphas_enet = -np.log10(alphas_enet)
for coef_l, coef_e, c in zip(coefs_lasso, coefs_enet, colors):
    l1 = plt.plot(neg_log_alphas_lasso, coef_l, c=c)
    l2 = plt.plot(neg_log_alphas_enet, coef_e, linestyle='--', c=c)

plt.xlabel('-Log(alpha)')
plt.ylabel('coefficients')
plt.title('Lasso and Elastic-Net Paths')
plt.legend((l1[-1], l2[-1]), ('Lasso', 'Elastic-Net'), loc='lower left')
plt.axis('tight')
知识点说明:
1. 线性回归
机器学习中需要用数据推断模型,这一步可能是不够准确的,
所以数据推断模型这一步,到底有多准确,是线性回归需要回答的问题;数据→ 模型
从模型预测更多的数据,从模型回到数据,模型 → 数据

2. t 统计量
2-1 什么是 t-统计量
      β1hat 的分布是什么?用 t-统计量 计算 β1hat 的分布
2-1-1 什么是 β1 hat?
      用标准差刻画系数误差
      β1 hat 是估计出的一元线性方程的斜率

3. p值是什么?
有了t分布以后,可以推断概率;假设 x y 没有关系,β1 就会距离0 非常近
做统计的时候,不会真正得到 0这个数
对于给定的 t-统计量,它(或者更大的t)发生的概率有多大?这个数叫做 p值

4. 什么是 F 统计量?
假设所有系数都是 0,对立假设就是至少有 一个 不是 0
当有多个系数为 0 时,定义统计量 F(n个数据,p个特征)和 t 统计没有本质区别
F统计量一般应该比较小,如果F统计量很大,表示 TSS 和RSS差别很大
意味着被解释掉的非常多,比较不容易相信所有数据都是 0,说明假设不成立

5. AIC BIC 是什么?
特征的筛选目标并不是为了减少 RSS,给定特征后算 β 是减少 RSS的工作
特征更多,RSS自然会更小,但这不是我们需要的
我们要考虑 RSS 同时考虑有多少个特征
AIC、BIC是在RSS的基础上考虑有多少个特征(d是特征个数)

6. 什么是交叉验证?
在做分类问题和回归问题时,可能会 倾向于增加很多特征
如果特征太多,会导致过拟合;拟合过渡,会导致拟合是基于噪声而不是信号
如果欠拟合,将不会得到拟合结果;所以是有一个平衡的
将原始数据,切成若干段,那其中的若干段预测下一段,轮换被预测部分
比如,1 2 预测 3 ;1 3 预测 2; 2 3 预测 1;
这样对 1 2 3 段数据分别有通过交叉验证而得到的预测
通过对预测的更细节的分析就可以判断是否过拟合

标签:sklearn,房价,boston,train,20210515,score,import,波士顿,lasso
来源: https://blog.51cto.com/u_15149862/2777722

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有