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