快速入门Python机器学习(八)

2022-05-22 10:29:53 浏览数 (1)

5.5 弹性网络(Elastic Net)

5.5.1类

代码语言:javascript复制
class sklearn.linear_model.ElasticNet(alpha=1.0, *, l1_ratio=0.5, fit_intercept=True, normalize=False, precompute=False, max_iter=1000, copy_X=True, tol=0.0001, warm_start=False, positive=False, random_state=None, selection='cyclic')

5.5.2 参数

参数

类型

解释

alpha=1.0

float, default=1.0

乘以惩罚项的常数。默认为1.0。有关该参数的确切数学含义。alpha = 0相当于一个普通的最小二乘法,由LinearRegression对象求解。出于数值原因,不建议对套索对象使用alpha = 0。鉴于此,您应该使用线性回归对象。

l1_ratio

float, default=0.5

弹性网混合参数,0 <= l1_ratio <= 1。对于l1_ratio = 0,惩罚是L2惩罚。对于l1_ratio = 1,这是l1惩罚。对于0 < l1_ratio < 1,处罚是l1和L2的组合。

5.5.3 属性

解释

coef_

ndarray of shape (n_features,) or (n_targets, n_features)参数向量(成本函数公式中的w)。

sparse_coef_

sparse matrix of shape (n_features,) or (n_tasks, n_features)拟合系数的稀疏表示。

intercept_

float or ndarray of shape (n_targets,决策函数中的独立项。

n_iter_

list of int由坐标下降解算器运行以达到指定公差的迭代次数。

dual_gap_

float or ndarray of shape (n_targets,)给定param alpha,优化结束时的双间隙,与y的每次观测形状相同。

5.5.4方法

fit(X, y[, sample_weight, check_input])

用坐标下降法拟合模型。

get_params([deep])

获取此估计器的参数。

path(*args, **kwargs)

用坐标下降法计算弹性网径。

predict(X)

用线性模型预测。

score(X, y[, sample_weight])

返回预测的确定系数R2。

set_params(**params)

设置此估计器的参数。

5.5.5弹性网络分析make_regression无噪音数据

代码语言:javascript复制
from sklearn.linear_model import ElasticNet
def ElasticNet_for_make_regression():
       myutil = util()
       X,y = make_regression(n_samples=100,n_features=1,n_informative=2,random_state=8)
       X_train,X_test,y_train,y_test = train_test_split(X, y, random_state=8,test_size=0.3)
       clf = ElasticNet().fit(X,y)
       print('lr.coef_: {} '.format(clf.coef_[:]))
       print('reg.intercept_: {}'.format(clf.intercept_))
       print('训练集得分: {:.2%}'.format(clf.score(X_train,y_train)))
       print('测试集得分: {:.2%}'.format(clf.score(X_test,y_test)))
       title = "make_regression ElasticNet()回归线(无噪音)"
       myutil.draw_line(X[:,0],y,clf,title)
       myutil.plot_learning_curve(ElasticNet(),X,y,title)
       myutil.show_pic(title)

输出

代码语言:javascript复制
lr.coef_: [45.44724868]
reg.intercept_: 1.129733006874405
训练集得分: 91.70%
测试集得分: 91.56%

5.5.6弹性网络分析make_regression有噪音数据

代码语言:javascript复制
def ElasticNet_for_make_regression_add_noise():
       myutil = util()
       X,y = make_regression(n_samples=100,n_features=1,n_informative=2,noise=50,random_state=8)
       X_train,X_test,y_train,y_test = train_test_split(X, y, random_state=8,test_size=0.3)
       clf = ElasticNet().fit(X,y)
       print('lr.coef_: {} '.format(clf.coef_[:]))
       print('reg.intercept_: {}'.format(clf.intercept_))
       print('训练集得分: {:.2%}'.format(clf.score(X_train,y_train)))
       print('测试集得分: {:.2%}'.format(clf.score(X_test,y_test)))
       title = "make_regression ElasticNet()回归线(有噪音)"
       myutil.draw_line(X[:,0],y,clf,title)
       myutil.plot_learning_curve(ElasticNet(),X,y,title)
       myutil.show_pic(title)

输出

代码语言:javascript复制
lr.coef_: [49.02657516]
reg.intercept_: 2.466666586211197
训练集得分: 65.00%
测试集得分: 56.72%

5.5.7弹性网络分析糖尿病数据

代码语言:javascript复制
#对弹性网络进行分析糖尿病数据
def ElasticNet_for_for_diabetes():
       myutil = util()
       X,y = datasets.load_diabetes().data,datasets.load_diabetes().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=10"
       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)

输出

代码语言:javascript复制
alpha=1,糖尿病数据训练集得分: 0.86%
alpha=1,糖尿病数据测试集得分: 0.93%
alpha=1,糖尿病数据弹性网络回归特征数: 9
alpha=10,糖尿病数据训练集得分: 0.00%
alpha=10,糖尿病数据测试集得分: -0.01%
alpha=10,糖尿病数据弹性网络回归特征数: 0
alpha=0.1,糖尿病数据训练集得分: 10.04%
alpha=0.1,糖尿病数据测试集得分: 11.08%
alpha=0.1,糖尿病数据弹性网络回归特征数: 9
l1_ratio=0.1,糖尿病数据训练集得分: 0.66%
l1_ratio=0.1,糖尿病数据测试集得分: 0.72%
l1_ratio=0.1,糖尿病数据弹性网络回归特征数: 9
l1_ratio=0.5,糖尿病数据训练集得分: 0.86%
l1_ratio=0.5,糖尿病数据测试集得分: 0.93%
l1_ratio=0.5,糖尿病数据弹性网络回归特征数: 9
l1_ratio=0.9,糖尿病数据训练集得分: 2.73%
l1_ratio=0.9,糖尿病数据测试集得分: 2.93%
l1_ratio=0.9,糖尿病数据弹性网络回归特征数: 6

糖尿病加载并返回糖尿病数据集(回归)维度为10

alpha

l1_ratio

训练集得分

测试集得分

特征数

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

结论:使用弹性网络分析分析糖尿病数据结论是很差的。

代码语言:javascript复制
alpha =10 (^ 橘黄色上箭头)
alpha =1 (s 蓝色方块)
alpha = 0.1 (v 绿色下箭头)

alpha越大越集中

代码语言:javascript复制
l1-ratio=0.5 (^ 橘黄色上箭头)
l1-ratio =0.1 (s 蓝色方块)
l1-ratio =0.9 (v 绿色下箭头)

l1-ratio越大越分散

5.5.8弹性网络分析波士顿房价数据

代码语言:javascript复制
#对弹性网络进行分析波士顿房价数据
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)

输出

代码语言:javascript复制
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

代码语言:javascript复制
alpha =10 (^ 橘黄色上箭头)
alpha =1 (s 蓝色方块)
alpha = 0.1 (v 绿色下箭头)

alpha越大越集中

代码语言:javascript复制
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

代码语言:javascript复制
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)))

输出

代码语言:javascript复制
线性回归糖尿病训练集得分: 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

代码语言:javascript复制
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)))

输出

代码语言:javascript复制
线性回归波士顿房价训练集得分: 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

将分类特征为独热编码的数字数组。

0 人点赞