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 |
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 |
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 | 将分类特征为独热编码的数字数组。 |