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 段数据分别有通过交叉验证而得到的预测
通过对预测的更细节的分析就可以判断是否过拟合