副问题[/!--empirenews.page--]
本文首要先容,Python数据科学:正则化要领。正则化要领的呈现,通过紧缩要领(正则化要领)举办回归。
正则化要领首要包罗岭回归与LASSO回归。
一、岭回归
岭回归通过工钱插手的处罚项(束缚项),对回归系数举办预计,为有偏预计。
有偏预计,应承预计有不大的偏度,以调换预计的偏差明显减小,并在其残差平方和为最小的原则下预计回归系数。
凡是岭回归方程中的R²会稍低于线性回归说明,但回归系数的明显性每每明明高于平凡线性回归。
这里差池响应的理论常识举办细说,说真话小F也是晕乎乎...
以是选择先调包,看看结果是啥样的。
行使呆板进修框架scikit-learn举办岭回归参数的选择(正则化系数)。
数据是书中的数据,已上传网盘,公家号回覆「正则化」,即可获取。
scikit-learn傍边的模子不会默认对数据尺度化,必需手动执行。
尺度化后的数据可以消除量纲,让每个变量的系数在必然意义下举办直接较量。
- import numpy as np
- import pandas as pd
- import matplotlib.pyplot as plt
- from sklearn.linear_model import Ridge
- from sklearn.linear_model import RidgeCV
- from sklearn.preprocessing import StandardScaler
-
- # 消除pandas输出省略号环境及换行环境
- pd.set_option('display.max_columns', 500)
- pd.set_option('display.width', 1000)
- # 读取数据,skipinitialspace:忽略脱离符后的空缺
- df = pd.read_csv('creditcard_exp.csv', skipinitialspace=True)
- # 获守名誉卡有支出的行数据
- exp = df[df['avg_exp'].notnull()].copy().iloc[:, 2:].drop('age2', axis=1)
- # 获守名誉卡无支出的行数据,NaN
- exp_new = df[df['avg_exp'].isnull()].copy().iloc[:, 2:].drop('age2', axis=1)
-
- # 选择4个持续变量,别离是年数 收入 内地小区价值 内地人均收入
- continuous_xcols = ['Age', 'Income', 'dist_home_val', 'dist_avg_income']
- # 尺度化
- scaler = StandardScaler()
- # 表明变量,二维数组
- X = scaler.fit_transform(exp[continuous_xcols])
- # 被表明变量,一维数组
- y = exp['avg_exp_ln']
-
- # 天生正则化系数
- alphas = np.logspace(-2, 3, 100, base=10)
- # 行使差异的正则化系数对模子举办交错验证
- rcv = RidgeCV(alphas=alphas, store_cv_values=True)
- # 行使数据集实习(fit)
- rcv.fit(X, y)
- # 输出最优参数,正则化系数及响应模子R²
- print('The best alpha is {}'.format(rcv.alpha_))
- print('The r-square is {}'.format(rcv.score(X, y)))
-
- # 实习好后行使transform举办数据转换
- X_new = scaler.transform(exp_new[continuous_xcols])
- # 行使模子对数据做猜测
- print(np.exp(rcv.predict(X_new)[:5]))
输出功效如下。

最优正则化系数为0.29,模子R²为0.475。
并行使最优正则化系数下的岭回归模子猜测数据。
对差异正则化系数下模子的均方偏差举办可视化。
- # 正则化系数搜刮空间傍边每轮交错验证的功效,模子的均方偏差
- cv_values = rcv.cv_values_
- n_fold, n_alphas = cv_values.shape
- # 模子均方偏差上下颠簸值
- cv_mean = cv_values.mean(axis=0)
- cv_std = cv_values.std(axis=0)
- ub = cv_mean + cv_std / np.sqrt(n_fold)
- lb = cv_mean - cv_std / np.sqrt(n_fold)
- # 绘制折线图,x轴是指数型情势
- plt.semilogx(alphas, cv_mean, label='mean_score')
- # y1(lb)和y2(ub)之间举办添补
- plt.fill_between(alphas, lb, ub, alpha=0.2)
- plt.xlabel('$alpha$')
- plt.ylabel('mean squared errors')
- plt.legend(loc='best')
- plt.show()
输出功效如下。

发明正则化系数在40或50以下时,模子的均方偏差相差不大。
当系数高出该阈值时,均方偏差则快速上升。
(编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|