5.5.8弹性网络分析波士顿房价数据
#对弹性网络进行分析波士顿房价数据 def ElasticNet_for_for_boston(): myutil = util() X,y = datasets.load_boston().data,datasets.load_boston().target X_train,X_test,y_train,y_test = train_test_split(X, y, random_state=8,test_size=0.3) ##################################################################################### elasticnet = ElasticNet().fit(X_train,y_train) print('alpha=1,波士顿房价数据训练集得分: {:.2%}'.format(elasticnet.score(X_train,y_train))) print('alpha=1,波士顿房价数据测试集得分: {:.2%}'.format(elasticnet.score(X_test,y_test))) print('alpha=1,波士顿房价数据弹性网络回归特征数: {}'.format(np.sum(elasticnet.coef_!=0))) title = "ElasticNet 波士顿房价数据 alpha=1" myutil.plot_learning_curve(ElasticNet(),X,y,title) myutil.show_pic(title) ##################################################################################### elasticnet10 = ElasticNet(alpha=10).fit(X_train,y_train) print('alpha=10,波士顿房价数据训练集得分: {:.2%}'.format(elasticnet10.score(X_train,y_train))) print('alpha=10,波士顿房价数据测试集得分: {:.2%}'.format(elasticnet10.score(X_test,y_test))) print('alpha=10,波士顿房价数据弹性网络回归特征数: {}'.format(np.sum(elasticnet10.coef_!=0))) title = "ElasticNet 波士顿房价数据 alpha=10" myutil.plot_learning_curve(ElasticNet(alpha=10),X,y,title) myutil.show_pic(title) ##################################################################################### elasticnet01 = ElasticNet(alpha=0.1).fit(X_train,y_train) print('alpha=0.1,波士顿房价数据训练集得分: {:.2%}'.format(elasticnet01.score(X_train,y_train))) print('alpha=0.1,波士顿房价数据测试集得分: {:.2%}'.format(elasticnet01.score(X_test,y_test))) print('alpha=0.1,波士顿房价数据弹性网络回归特征数: {}'.format(np.sum(elasticnet01.coef_!=0))) title = "ElasticNet 波士顿房价数据 alpha= 0.1" myutil.plot_learning_curve(ElasticNet(alpha=0.1),X,y,title) myutil.show_pic(title) ##################################################################################### title = "Lasso 波士顿房价数据 数据分布比较" plt.plot(elasticnet.coef_,'s',label='弹性网络 alpha=1') plt.plot(elasticnet10.coef_,'^',label='弹性网络 alpha=10') plt.plot(elasticnet01.coef_,'v',label='弹性网络 alpha=0.1') plt.xlabel(u'系数指数') plt.ylabel(u'系数大小') plt.legend(loc='lower right') title = "比较弹性网络参数" myutil.show_pic(title) ##################################################################################### elasticnet_01 = ElasticNet(l1_ratio=0.1).fit(X_train,y_train) print('l1_ratio=0.1,波士顿房价数据训练集得分: {:.2%}'.format(elasticnet_01.score(X_train,y_train))) print('l1_ratio=0.1,波士顿房价数据测试集得分: {:.2%}'.format(elasticnet_01.score(X_test,y_test))) print('l1_ratio=0.1,波士顿房价数据弹性网络回归特征数: {}'.format(np.sum(elasticnet_01.coef_!=0))) title = " ElasticNet 波士顿房价数据 l1_ratio=0.1" myutil.plot_learning_curve(ElasticNet(l1_ratio=0.1),X,y,title) myutil.show_pic(title) ##################################################################################### elasticnet05 = ElasticNet(l1_ratio=0.5).fit(X_train,y_train) print(' l1_ratio=0.5,波士顿房价数据训练集得分: {:.2%}'.format(elasticnet05.score(X_train,y_train))) print(' l1_ratio=0.5,波士顿房价数据测试集得分: {:.2%}'.format(elasticnet05.score(X_test,y_test))) print(' l1_ratio=0.5,波士顿房价数据弹性网络回归特征数: {}'.format(np.sum(elasticnet05.coef_!=0))) title = "ElasticNet 波士顿房价数据 l1_ratio=0.5" myutil.plot_learning_curve(ElasticNet(l1_ratio=0.5),X,y,title) myutil.show_pic(title) ##################################################################################### elasticnet09 = ElasticNet(l1_ratio=0.9).fit(X_train,y_train) print('l1_ratio=0.9,波士顿房价数据训练集得分: {:.2%}'.format(elasticnet09.score(X_train,y_train))) print('l1_ratio=0.9,波士顿房价数据测试集得分: {:.2%}'.format(elasticnet09.score(X_test,y_test))) print('l1_ratio=0.9,波士顿房价数据弹性网络回归特征数: {}'.format(np.sum(elasticnet09.coef_!=0))) title = "ElasticNet 波士顿房价数据 l1_ratio= 0.9" myutil.plot_learning_curve(ElasticNet(l1_ratio=0.9),X,y,title) myutil.show_pic(title) ##################################################################################### title = "ElasticNet 波士顿房价数据 数据分布比较" plt.plot(elasticnet_01.coef_,'s',label='弹性网络 l1_ratio=0.1') plt.plot(elasticnet05.coef_,'^',label='弹性网络 l1_ratio=0.5') plt.plot(elasticnet09.coef_,'v',label='弹性网络 l1_ratio=0.9') plt.xlabel(u'系数指数') plt.ylabel(u'系数大小') plt.legend(loc='lower right’) title = "比较弹性网络参数" myutil.show_pic(title)
输出
alpha=1,波士顿房价数据训练集得分: 70.40% alpha=1,波士顿房价数据测试集得分: 63.31% alpha=1,波士顿房价数据弹性网络回归特征数: 10 alpha=10,波士顿房价数据训练集得分: 56.10% alpha=10,波士顿房价数据测试集得分: 48.73% alpha=10,波士顿房价数据弹性网络回归特征数: 5 alpha=0.1,波士顿房价数据训练集得分: 74.12% alpha=0.1,波士顿房价数据测试集得分: 67.82% alpha=0.1,波士顿房价数据弹性网络回归特征数: 12 l1_ratio=0.1,波士顿房价数据训练集得分: 70.63% l1_ratio=0.1,波士顿房价数据测试集得分: 63.64% l1_ratio=0.1,波士顿房价数据弹性网络回归特征数: 12 l1_ratio=0.5,波士顿房价数据训练集得分: 70.40% l1_ratio=0.5,波士顿房价数据测试集得分: 63.31% l1_ratio=0.5,波士顿房价数据弹性网络回归特征数: 10 l1_ratio=0.9,波士顿房价数据训练集得分: 69.97% l1_ratio=0.9,波士顿房价数据测试集得分: 62.78% l1_ratio=0.9,波士顿房价数据弹性网络回归特征数: 10
alpha |
l1_ratio |
训练集得分 |
测试集得分 |
特征数 |
0.1 |
0.5 |
74.12% |
67.82% |
12 |
1.0 |
0.5 |
70.40% |
63.31% |
10 |
10 |
0.5 |
56.10% |
48.73% |
5 |
1.0 |
0.1 |
70.63% |
63.64% |
12 |
1.0 |
0.5 |
70.40% |
63.31% |
10 |
1.0 |
0.9 |
69.97% |
62.78% |
10 |
波士顿加载并返回波士顿房价数据集(回归)维度:13
alpha =10 (^ 橘黄色上箭头) alpha =1 (s 蓝色方块) alpha = 0.1 (v 绿色下箭头)
alpha越大越集中
l1-ratio=0.5 (^ 橘黄色上箭头) l1-ratio =0.1 (s 蓝色方块) l1-ratio =0.9 (v 绿色下箭头)
成对出现,与l1-ratio无关。
5.6总结
5.6.1分析糖尿病数据
alpha |
l1_ratio |
训练集得分 |
测试集得分 |
特征数 |
|
线性回归 |
- |
- |
53.04% |
45.93% |
- |
岭回归 |
1 |
- |
43.01% |
43.04% |
- |
10 |
- |
14.47% |
15.88% |
- |
|
0.1 |
- |
52.48% |
47.11% |
- |
|
套索回归 |
1 |
- |
36.73% |
38.28% |
3 |
10 |
- |
0.00% |
-0.01% |
0 |
|
0.1 |
- |
52.36% |
52.36% |
7 |
|
弹性网络 |
0.1 |
0.5 |
10.04% |
11.08% |
9 |
1.0 |
0.5 |
0.86% |
0.93% |
9 |
|
10 |
0.5 |
0.00% |
-0.01% |
0 |
|
1.0 |
0.1 |
0.66% |
0.72% |
9 |
|
1.0 |
0.5 |
0.86% |
0.93% |
9 |
|
1.0 |
0.9 |
2.73% |
2.93% |
6 |
def Analysis_diabetes_data(): myutil = util() ax = plt.gca() diabetes = datasets.load_diabetes() X,y = diabetes.data,diabetes.target X_train,X_test,y_train,y_test = train_test_split(X, y, random_state =8) #将特征数字中的最大和最小值一散点图形式画出来 plt.plot(X.min(axis=0),'v',label='最小') plt.plot(X.max(axis=0),'^',label='最大') #纵坐标为对数形式 plt.yscale('log') #设置图注位置最佳 plt.legend(loc='best') ax.set_xlabel(u'特征') ax.set_ylabel(u'特征量') title = u"糖尿病数据分析" myutil.show_pic(title) #对训练集和测试集数据进行预处理 scaler = StandardScaler() scaler.fit(X_train) X_train_scaler = scaler.transform(X_train) X_test_scaler = scaler.transform(X_test) plt.plot(X_train_scaler.min(axis=0),'v',label=u'训练集最小') plt.plot(X_train_scaler.max(axis=0),'^',label=u'训练集最大') plt.plot(X_test_scaler.min(axis=0),'v',label=u'测试集最小') plt.plot(X_test_scaler.max(axis=0),'^',label=u'测试集最大') plt.legend(loc='best') ax.set_xlabel(u'预处理特征') ax.set_ylabel(u'预处理特征量') title = u"预处理后的糖尿病数据分析" myutil.show_pic(title) #用线性回归最优解处理 clf = LinearRegression() clf = clf.fit(X_train_scaler,y_train) print('线性回归糖尿病训练集得分: {:.2%}'.format(clf.score(X_train_scaler,y_train))) print('线性回归糖尿病测试集得分: {:.2%}'.format(clf.score(X_test_scaler,y_test))) ############################################################################################ #用岭回归最优解处理 clf = Ridge(alpha=0.1) clf = clf.fit(X_train_scaler,y_train) print('岭回归糖尿病训练集得分: {:.2%}'.format(clf.score(X_train_scaler,y_train))) print('岭回归糖尿病测试集得分: {:.2%}'.format(clf.score(X_test_scaler,y_test))) ############################################################################################ #用套索回归最优解处理 clf = Lasso(alpha=0.1) clf = clf.fit(X_train_scaler,y_train) print('套索回归糖尿病训练集得分: {:.2%}'.format(clf.score(X_train_scaler,y_train))) print('套索回归糖尿病测试集得分: {:.2%}'.format(clf.score(X_test_scaler,y_test))) #用弹性网络回归最优解处理 clf = ElasticNet(alpha=0.1,l1_ratio=0.5) clf = clf.fit(X_train_scaler,y_train) print('弹性网络糖尿病训练集得分: {:.2%}'.format(clf.score(X_train_scaler,y_train))) print('弹性网络糖尿病测试集得分: {:.2%}'.format(clf.score(X_test_scaler,y_test)))
输出
线性回归糖尿病训练集得分: 53.04% 线性回归糖尿病测试集得分: 45.93% 岭回归糖尿病训练集得分: 53.04% 岭回归糖尿病测试集得分: 45.98% 套索回归糖尿病训练集得分: 52.96% 套索回归糖尿病测试集得分: 46.36% 弹性网络糖尿病训练集得分: 52.52% 弹性网络糖尿病测试集得分: 46.92%
拟合前 |
拟合后 |
|||||
alpha |
l1_ratio |
训练集得分 |
测试集得分 |
训练集得分 |
测试集得分 |
|
线性回归 |
- |
- |
53.04% |
45.93% |
53.04% |
45.93% |
岭回归 |
0.1 |
- |
52.48% |
47.11% |
53.04% |
45.98% |
套索回归 |
0.1 |
- |
52.36% |
52.36% |
52.96% |
46.36% |
弹性网络 |
0.1 |
0.5 |
10.04% |
11.08% |
52.52% |
46.92% |
结论:数据处理后,弹性网络的得分提升很明显。
5.6.2分析波士顿房价
alpha |
l1_ratio |
训练集得分 |
测试集得分 |
特征数 |
|
线性回归 |
- |
- |
74.86% |
71.54% |
- |
岭回归 |
1 |
- |
74.86% |
69.76% |
- |
10 |
- |
74.48% |
68.49% |
- |
|
0.1 |
- |
74.98% |
70.64% |
- |
|
套索回归 |
1 |
- |
69.75% |
62.49% |
10 |
10 |
- |
54.76% |
68.49% |
4 |
|
0.1 |
- |
74.25% |
67.98% |
12 |
|
弹性网络 |
0.1 |
0.5 |
74.12% |
67.82% |
12 |
1.0 |
0.5 |
70.40% |
63.31% |
10 |
|
10 |
0.5 |
56.10% |
48.73% |
5 |
|
1.0 |
0.1 |
70.63% |
63.64% |
12 |
|
1.0 |
0.5 |
70.40% |
63.31% |
10 |
|
1.0 |
0.9 |
69.97% |
62.78% |
10 |
from sklearn.preprocessing import StandardScaler def Analysis_boston_data(): myutil = util() ax = plt.gca() boston = datasets.load_boston() X,y = boston.data,boston.target X_train,X_test,y_train,y_test = train_test_split(X, y, random_state =8) #将特征数字中的最大和最小值一散点图形式画出来 plt.plot(X.min(axis=0),'v',label='最小') plt.plot(X.max(axis=0),'^',label='最大') #纵坐标为对数形式 plt.yscale('log') #设置图注位置最佳 plt.legend(loc='best') ax.set_xlabel(u'特征') ax.set_ylabel(u'特征量') title = u"波士顿房价数据分析" myutil.show_pic(title) #对训练集和测试集数据进行预处理 scaler = StandardScaler() scaler.fit(X_train) X_train_scaler = scaler.transform(X_train) X_test_scaler = scaler.transform(X_test) plt.plot(X_train_scaler.min(axis=0),'v',label=u'训练集最小') plt.plot(X_train_scaler.max(axis=0),'^',label=u'训练集最大') plt.plot(X_test_scaler.min(axis=0),'v',label=u'测试集最小') plt.plot(X_test_scaler.max(axis=0),'^',label=u'测试集最大') plt.legend(loc='best') ax.set_xlabel(u'预处理特征') ax.set_ylabel(u'预处理特征量') title = u"预处理后的波士顿房价数据分析" myutil.show_pic(title) ############################################################################################ #用线性回归最优解处理 clf = LinearRegression() clf = clf.fit(X_train_scaler,y_train) print('线性回归波士顿房价训练集得分: {:.2%}'.format(clf.score(X_train_scaler,y_train))) print('线性回归波士顿房价测试集得分: {:.2%}'.format(clf.score(X_test_scaler,y_test))) ############################################################################################ #用岭回归最优解处理 clf = Ridge(alpha=0.1) clf = clf.fit(X_train_scaler,y_train) print('岭回归波士顿房价训练集得分: {:.2%}'.format(clf.score(X_train_scaler,y_train))) print('岭回归波士顿房价测试集得分: {:.2%}'.format(clf.score(X_test_scaler,y_test))) ############################################################################################ #用套索回归最优解处理 clf = Lasso(alpha=10) clf = clf.fit(X_train_scaler,y_train) print('套索回归波士顿房价训练集得分: {:.2%}'.format(clf.score(X_train_scaler,y_train))) print('套索回归波士顿房价测试集得分: {:.2%}'.format(clf.score(X_test_scaler,y_test))) ############################################################################################ #用弹性网络回归最优解处理 clf = ElasticNet(alpha=0.1,l1_ratio=0.5) clf = clf.fit(X_train_scaler,y_train) print('弹性网络波士顿房价训练集得分: {:.2%}'.format(clf.score(X_train_scaler,y_train))) print('弹性网络波士顿房价测试集得分: {:.2%}'.format(clf.score(X_test_scaler,y_test)))
输出
线性回归波士顿房价训练集得分: 74.45% 线性回归波士顿房价测试集得分: 71.90% 岭回归波士顿房价训练集得分: 74.45% 岭回归波士顿房价测试集得分: 71.90% 套索回归波士顿房价训练集得分: 0.00% 套索回归波士顿房价测试集得分: -0.00% 弹性网络波士顿房价训练集得分: 73.86% 弹性网络波士顿房价测试集得分: 71.25%
拟合前 |
拟合后 |
|||||
alpha |
l1_ratio |
训练集得分 |
测试集得分 |
训练集得分 |
测试集得分 |
|
线性回归 |
- |
- |
74.86% |
71.54% |
74.45% |
71.90% |
岭回归 |
0.1 |
- |
74.98% |
70.64% |
74.45% |
71.90% |
套索回归 |
10 |
- |
54.76% |
68.49% |
0.00% |
-0.00% |
弹性网络 |
0.1 |
0.5 |
74.12% |
67.82% |
73.86% |
71.25% |
除了套索回归得分基本没变。
拟合前,数据分散
拟合后数据集中在0-10之间。
sklearn.preprocessing.StandardScaler:通过去除均值和缩放单位方差来标准化特征
sklearn.preprocessing.StandardScaler(copy=True, with_mean=True, with_std=True)
参数 |
解释 |
copy |
如果为false,就会用归一化的值替代原来的值;如果被标准化的数据不是np.array或scipy.sparse CSR matrix, 原来的数据还是被copy而不是被替代 |
with_std |
boolean类型,默认为True,表示将数据方差规范到1 |
with_mean |
boolean类型,默认为True,表示将数据均值规范到0 |
这里是用于做标准化,将数据的方差规范到1,均值规范到0,实际上就是标准正态分布的方差和均值
均值:平均数
Sklearn提供了以下的缩放方法
sklearn.preprocessing.StandardScaler |
通过去除均值和缩放单位方差来标准化特征 |
sklearn.preprocessing.MinMaxScaler |
通过将每个特征缩放到给定范围来变换特征 |
sklearn.preprocessing.RobustScaler |
使用对异常值具有鲁棒性的统计数据来缩放特征。 |
sklearn.preprocessing.Normalizer |
将样本分别标准化为单位标准 |
sklearn.preprocessing.MaxAbsScaler |
按最大绝对值缩放每个特征。 |
sklearn.preprocessing.QuantileTransformer |
利用分位数信息变换特征 |
sklearn.preprocessing.Binarizer |
根据阈值对数据进行二值化(将特征值设置为0或1) |
sklearn.preprocessing.PolynomialFeatures |
生成多项式和交互特征 |
sklearn.preprocessing.OneHotEncoder |
将分类特征为独热编码的数字数组。 |









