哑变量:利用类似pd.get_dummies得到的0,1数据。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.neural_network import MLPRegressor
from sklearn.neighbors import KNeighborsRegressor
from sklearn.preprocessing import OneHotEncoder#独热编码,同pd.get_dummies,但仅能用于整型变量
def base_for_dummies():
colour = pd.DataFrame({'数据特征':[1,2,3,4,5,6,7],'颜色类型':['赤','橙','黄','绿','青','蓝','紫']})
print(colour)
输出
数据特征 | 颜色类型 | |
---|---|---|
0 | 1 | 赤 |
1 | 2 | 橙 |
2 | 3 | 黄 |
3 | 4 | 绿 |
4 | 5 | 青 |
5 | 6 | 蓝 |
6 | 7 | 紫 |
colour_dum = pd.get_dummies(colour)
print(colour_dum)
输出
数据特征 | 颜色类型_橙 | 颜色类型_紫 | 颜色类型_绿 | 颜色类型_蓝 | 颜色类型_赤 | 颜色类型_青 | 颜色类型_黄 | |
---|---|---|---|---|---|---|---|---|
0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
1 | 2 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
2 | 3 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
3 | 4 | 0 | 0 | 1 | 0 | 0 | 0 | 0 |
4 | 5 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
5 | 6 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
6 | 7 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
colour['数据特征'] = colour['数据特征'].astype(str)
colour_dum = pd.get_dummies(colour,columns=['数据特征'])
print(colour_dum)
颜色类型 | 数据特征_1 | 数据特征_2 | 数据特征_3 | 数据特征_4 | 数据特征_5 | 数据特征_6 | 数据特征_7 | |
---|---|---|---|---|---|---|---|---|
0 | 赤 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
1 | 橙 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
2 | 黄 | 0 | 0 | 1 | 0 | 0 | 0 | 0 |
3 | 绿 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
4 | 青 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
5 | 蓝 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
6 | 紫 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
class sklearn.preprocessing.OneHotEncoder(*, categories='auto', drop=None, sparse=True, dtype=, handle_unknown='error')
将分类特征编码为独热的数字数组。
这个转换器的输入应该是一个类似整数或字符串的数组,表示由分类(离散)特征获取的值。这些特征使用one-hot(也称为'one-of-K'或'dummy')编码方案进行编码。这将为每个类别创建一个二进制列,并返回稀疏矩阵或密集数组(取决于稀疏参数)
默认情况下,编码器根据每个特征中的唯一值导出类别。或者,也可以手动指定类别。
这种编码是为许多scikit学习估计器提供分类数据所必需的,特别是线性模型和具有标准核的支持向量机。
注意:y标签的独热编码应该改用LabelBinarizer。
参数
参数 | 类型 | 解释 |
---|---|---|
categories_ | list of arrays | 拟合过程中确定的每个特征的类别(按X中特征的顺序排列,并与变换的输出相对应)。这包括drop中指定的类别(如果有)。 |
drop_idx_ | array of shape (n_features,) | •drop_idx_[i] :是要为每个功能删除的类别的categories_[i]中的索引。•drop_idx_[i]=None:如果不从索引为i的功能中删除任何类别,例如,当drop='if_binary'且功能不是二进制时。•drop_idx_= None:如果将保留所有变换的特征,请删除。 |
方法
fit(X[, y]) | 将独热编码器安装到X。 |
---|---|
fit_transform(X[, y]) | 将独热编码器安装到X,然后变换X。 |
get_feature_names([input_features]) | 返回输出功能的功能名称。 |
get_params([deep]) | 获取此估计器的参数。 |
inverse_transform(X) | 将数据转换回原始表示形式。 |
set_params(**params) | 设置此估计器的参数。 |
transform(X) | 使用独热编码转换X。 |
#生成随机数列
rnd = np.random.RandomState(56)
x = rnd.uniform(-5,5,size=50)
#向数据添加噪音
y_no_noise = (np.cos(6*x)+x)
X = x.reshape(-1,1)
y = (y_no_noise + rnd.normal(size=len(x)))/2
plt.plot(X,y,'o',c='g')
plt.show()
用MLPRegressor与KNeighborsRegressor进行拟合
line = np.linspace(-5,5,1000,endpoint=False).reshape(-1,1)
mlpr = MLPRegressor().fit(X,y)
knr = KNeighborsRegressor().fit(X,y)
plt.plot(line,mlpr.predict(line),label='MLP')
plt.plot(line,knr.predict(line),label='KNN')
plt.plot(X,y,'o',c='g')
plt.legend(loc='best')
plt.show()
MLPRegressor与KNeighborsRegressor拟合线不一致
digitize离散化处理,又称装箱处理
#设置11个箱子
bins = np.linspace(-5,5,11)
#将数据装箱
target_bin = np.digitize(X, bins=bins)
print("装箱数据范围:\n{}".format(bins))
print("前10个数据点的特征值:\n{}".format(X[:10]))
print("前10个数据点所在的箱子:\n{}".format(target_bin[:10]))
输出
分为
[-5,-4],[-4,-3],[-3,-2],[-2,-1],[-1,0],[0,1],[1,2],[2,3],[3,4],[4,5]
10个箱子
装箱数据范围:
[-5. -4. -3. -2. -1. 0. 1. 2. 3. 4. 5.]
前10个数据点的特征值:
[[ 4.84191851]
[-1.66587734]
[ 1.73701625]
[-3.03609583]
[-1.45553535]
[ 3.13365953]
[-2.52150446]
[-0.41388675]
[ 3.77301421]
[-1.08341539]]
前10个数据点所在的箱子:
[[10]
[ 4]
[ 7]
[ 2]
[ 4]
[ 9]
[ 3]
[ 5]
[ 9]
[ 4]]
onehot = OneHotEncoder(sparse = False)
onehot.fit(target_bin)
#将独热编码转为数据
X_in_bin = onehot.transform(target_bin)
print("装箱后的数据形态:\n{}".format(X_in_bin.shape))
print("装箱后的前10个数据点:\n{}".format(X_in_bin[:10]))
输出
装箱后的数据形态:
(50, 10)
装箱后的前10个数据点:
[[0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]
[0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]
[0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]
[0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]
[0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]]
仍旧50个数据,10个形态(因为装进了10个箱子)
#使用独热编码进行数据表达
onehot_line = onehot.transform(np.digitize(line,bins=bins))
onehot_mlpr = MLPRegressor().fit(X_in_bin,y)
onehot_knr = KNeighborsRegressor().fit(X_in_bin,y)
plt.plot(line,onehot_mlpr.predict(onehot_line),label='New MLP')
plt.plot(line,onehot_knr.predict(onehot_line),label='New KNN')
plt.plot(X,y,'o',c='g')
plt.legend(loc='best')
plt.show()
MLP与KNN拟合曲线保持一致,但是在每个箱子里面均为横直线,即斜率为0
对于基于决策树算法(随机森林,梯度上升决策树,决策树)没有效果
class sklearn.preprocessing.PolynomialFeatures(degree=2, *, interaction_only=False, include_bias=True, order='C')
属性
属性 | 类型 | 解释 |
---|---|---|
powers_ | ndarray of shape (n_output_features, n_input_features) | powers_[i,j]是第i个输出中第j个输入的指数。 |
n_input_features_ | Int | 输入功能的总数。 |
n_output_features_ | Int | 多项式输出特征的总数。输出特征的数量是通过迭代输入特征的所有适当大小的组合来计算的。 |
方法
fit(X[, y]) | 计算输出特征的数量。 |
---|---|
fit_transform(X[, y]) | 适应数据,然后转换它。 |
get_feature_names([input_features]) | 返回输出功能的功能名称。 |
get_params([deep]) | 获取此估计器的参数。 |
set_params(**params) | 设置此估计器的参数。 |
transform(X) | 将数据转换为多项式特征。 |
统计建模方式:
array_1 = [0,1,2,3,4]
array_2 = [5,6,7,8,9]
array3 = np.hstack((array_1,array_2))
print("将数组2添加到数据1后面去得到:\n{}".format(array3))
输出
将数组2添加到数据1后面去得到:
[0 1 2 3 4 5 6 7 8 9]
#将原始数据和装箱数据进行堆叠
X_stack = np.hstack([X,X_in_bin])
print("X.shape:\n",X.shape)
print("X_in_bin.shape:\n",X_in_bin.shape)
print("X_stack.shape:\n",X_stack.shape
输出
X.shape:
(50, 1)
X_in_bin.shape:
(50, 10)
X_stack.shape:
(50, 11)
#将数据进行堆叠
line_stack = np.hstack([line,onehot_line])
mlpr_interact = MLPRegressor().fit(X_stack,y)
plt.plot(line,mlpr_interact.predict(line_stack),label='MLP for interaction')
plt.ylim(-4,4)
for vline in bins:
plt.plot([vline,vline],[-5,5],":",c='k')
plt.legend(loc='lower right')
plt.plot(X,y,"o",c='g')
plt.show()
每一个箱子中的斜率加大了,但是斜率是一样的。
#使用新的叠堆方式处理数据
X_multi = np.hstack([X_in_bin,X*X_in_bin])
print("X_multi.shape:\n",X_multi.shape)
print("X_multi[0]:\n",X_multi[0])
输出
X_multi.shape:
(50, 20)
X_multi[0]:
[0. 0. 0. 0. 0. 0.
0. 0. 0. 1. 0. 0.
0. 0. 0. 0. 0. 0.
0. 4.84191851]
前10个数据点的特征值:
[[ 4.84191851]
[-1.66587734]
[ 1.73701625]
[-3.03609583]
[-1.45553535]
[ 3.13365953]
[-2.52150446]
[-0.41388675]
[ 3.77301421]
[-1.08341539]]
保持X_in_bin中的1以及元数据:4.84191851
ax4+bx3+cx2+dx+e
rnd = np.random.RandomState(50)
x = rnd.uniform(-5,5,size=50)
X = x.reshape(-1,1)
y_no_noise = (np.cos(6*x)+x)
y = (y_no_noise + rnd.normal(size=len(x)))/2
poly = PolynomialFeatures(degree=20,include_bias=False)
X_poly = poly.fit_transform(X)
print(X_poly.shape)
输出
(50, 20)
print("原始数据第一个样本:\n {} ".format(X[0]))
print("多项式处理后第一个样本:\n{} ".format(X_poly[0]))
print("PolynomialFeatures对原始数据的处理:\n{}".format(poly.get_feature_names()))
输出
原始数据第一个样本:
[4.84191851]
多项式处理后第一个样本:
[4.84191851e+00 2.34441748e+01 1.13514784e+02 5.49629333e+02
2.66126044e+03 1.28856062e+04 6.23910549e+04 3.02092403e+05
1.46270680e+06 7.08230711e+06 3.42919539e+07 1.66038846e+08
8.03946561e+08 3.89264373e+09 1.88478637e+10 9.12598202e+10
4.41872612e+11 2.13951118e+12 1.03593388e+13 5.01590740e+13]
PolynomialFeatures对原始数据的处理:
['x0', 'x0^2', 'x0^3', 'x0^4', 'x0^5', 'x0^6', 'x0^7', 'x0^8', 'x0^9', 'x0^10', 'x0^11', 'x0^12', 'x0^13', 'x0^14', 'x0^15', 'x0^16', 'x0^17', 'x0^18', 'x0^19', 'x0^20']
line = np.linspace(-5,5,1000,endpoint=False).reshape(-1,1)
LNR_poly = LinearRegression().fit(X_poly,y)
line_poly = poly.transform(line)
plt.plot(line,LNR_poly.predict(line_poly),label='Line Regressor')
plt.xlim(np.min(X)-0.5,np.max(X)+0.5)
plt.ylim(np.min(y)-0.5,np.max(y)+0.5)
plt.plot(X,y,"o",c='g')
plt.legend(loc='lower right')
plt.show()
除了PolynomialFeatures,还有sin()、log()、exp()
自动选择特征
class sklearn.feature_selection.SelectPercentile(score_func=, *, percentile=10)[source]
参数
参数 | 类型 | 解释 |
---|---|---|
score_func | callable, default=f_classif | 函数获取两个数组X和y,并返回一对数组(scores,pvalues)或一个带有scores的数组。默认值为f_classif 。默认函数仅适用于分类任务。要保留的功能的百分比 |
percentile | int, default=10 | 要保留的功能的百分比 |
属性
属性 | 类型 | 解释 |
---|---|---|
scores_ | array-like of shape (n_features,) | 多特征。 |
pvalues_ | array-like of shape (n_features,) | 特征得分的p值,如果score_func只返回得分,则为无。 |
方法
fit(X, y) | 在(X,y)上运行score函数并获得适当的特性。 |
---|---|
fit_transform(X[, y]) | 适应数据,然后转换它。 |
get_params([deep]) | 获取此估计器的参数。 |
get_support([indices]) | 获取所选特征的掩码或整数索引。 |
inverse_transform(X) | 反转转换操作。 |
set_params(**params) | 设置此估计器的参数。 |
transform(X) | 将X减少到选定的特征。 |
股票数据预处理
def dealdata(mydata):
if str(mydata)[-1]=='%':
try:
return (float(str(mydata)[:-1])/100)
except:
return mydata
elif str(mydata)[-1]=='万':
try:
return float(str(mydata)[:-1])*10000
except:
return mydata
elif str(mydata)[-1]=='亿':
try:
return float(str(mydata)[:-1])*100000000
except:
return mydata
else:
return mydata
def dealcsv():
stock = pd.read_csv('000002.csv',encoding='GBK')
new_stock = stock.applymap(dealdata)
print(new_stock.head())
new_stock.to_csv('stock.csv',encoding='GBK')
from sklearn.preprocessing import StandardScaler
from sklearn.feature_selection import SelectPercentile
def stock():
stock = pd.read_csv('stock.csv',encoding='GBK')
print(stock.head())
编号 | 序号 | 代码 | 名称 | … | 总市值 | 每股收益 | 净利润 | 主营收 | |
---|---|---|---|---|---|---|---|---|---|
0 | 0 | 1401 | 600136 | 当代文体 | 3397000000 | -3.34 | -1.299000e+09 | 4.110000e+08 | |
1 | 1 | 1402 | 688668 | 鼎通科技 | 2212000000 | 0.88 | 5.408000e+07 | 2.700000e+08 | |
2 | 2 | 1403 | 688008 | 澜起科技 | 95500000000 | 0.95 | 8.780000e+08 | 1.468000e+09 | |
3 | 3 | 1404 | 603916 | 苏博特 | 8651000000 | 1.30 | 3.020000e+08 | 2.451000e+09 | |
4 | 4 | 1405 | 600277 | 亿利洁能 | 7395000000 | 0.13 | 2.250000e+08 | 8.683000e+09 | |
… | |||||||||
[5 rows x 24 columns] |
#设置目标
y = stock['涨跌幅']
print(y.shape)
print(y[0])
(408,)
-0.0252
408条数据
'涨跌幅'列第一个数据为:-0.0252
#提取特征值
features = stock.loc[:,'价格':'流通市值']
X = features.values
print(X.shape)
print(X[1])
(408, 15)
[ 2.594e+01 -6.700e-01 0.000e+00 2.661e+01 2.661e+01 2.670e+01
2.593e+01 6.581e+03 1.721e+07 3.380e-02 9.800e-01 3.226e-01
2.890e-02 2.950e+01 5.020e+08]
408条数据,提取15个特征项
用神经网络进行处理
mlp = MLPRegressor(random_state=53,hidden_layer_sizes=[100,100,100],alpha=0.1)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=62)
#预处理
scaler = StandardScaler()
scaler.fit(X_train)
X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test)
mlp.fit(X_train_scaled,y_train)
print('训练集得分:{:.2%}'.format(mlp.score(X_train_scaled,y_train)))
print('测试集得分:{:.2%}'.format(mlp.score(X_test_scaled,y_test)))
训练集得分:47.47%
测试集得分:48.47%
random_state,hidden_layer_sizes,alpha根据自身数据,调整到最优解
获取涨幅>=0.05的企业名称
wanted = stock.loc[:,'名称']
print(wanted[y>=-0.05])
0 当代文体
1 鼎通科技
2 澜起科技
3 苏博特
4 亿利洁能
...
362 盟升电子
363 青海春天
364 瀚蓝环境
365 华润微
366 ST亚星
Name: 名称, Length: 367, dtype: object
from sklearn.preprocessing import PolynomialFeatures
select = SelectPercentile(percentile=50)
select.fit(X_train_scaled,y_train)
X_train_selected = select.transform(X_train_scaled)
print('经过缩放后的形态:{}'.format(X_train_scaled.shape))
print('特征选择后的形态:{}'.format(X_train_selected.shape))
15个特征项成为了7个,某些被过滤掉了
mask = select.get_support()
print(mask)
#用图像表示单一变量法特征选择结果
plt.matshow(mask.reshape(1,-1),cmap=plt.cm.cool)
plt.xlabel(u"特征选择")
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
plt.show()
[False False False False False False False True True True True False True True True]
False (蓝色):过滤掉
True (粉色) :没有过滤掉
#使用特征选择后数据集训练神经网络
X_test_selected = select.transform(X_test_scaled)
mlp_select = MLPRegressor(random_state=53,hidden_layer_sizes=[100,100,100],alpha=0.1)
mlp_select.fit(X_train_selected,y_train)
print('单一变量法特征选择后训练集得分:{:.2%}'.format(mlp_select.score(X_train_selected,y_train)))
print('单一变量法特征选择后测试集得分:{:.2%}'.format(mlp_select.score(X_test_selected,y_test)))
输出
单一变量法特征选择后训练集得分:29.44%
单一变量法特征选择后测试集得分:18.36%
噪音多得分上升,否则下降,所以适合噪音多数据
测试集得分: 48.47% -> 18.36 %
直接处理 | univariate |
---|---|
47.47%:48.47% | 29.44%:18.36% |
class sklearn.feature_selection.SelectFromModel(estimator, *, threshold=None, prefit=False, norm_order=1, max_features=None, importance_getter='auto')
属性
属性 | 类型 | 解释 |
---|---|---|
estimator_ | an estimator | 构建变压器的基估计器。只有当一个非拟合的估计器被传递到SelectFromModel时,即prefit为False时,才会存储这个值。 |
threshold_ | float | 用于特征选择的阈值。 |
方法
fit(X[, y]) | 安装SelectFromModel meta-transformer。 |
---|---|
fit_transform(X[, y]) | 适应数据,然后转换它。 |
get_params([deep]) | 获取此估计器的参数。 |
get_support([indices]) | 获取所选特征的掩码或整数索引。 |
inverse_transform(X) | 反转转换操作。 |
partial_fit(X[, y]) | 只安装一次SelectFromModel meta-transformer。 |
set_params(**params) | 设置此估计器的参数。 |
transform(X) | 将X减少到选定的特征。 |
from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import RandomForestRegressor
Def selectFromModel():
stock = pd.read_csv('stock.csv',encoding='GBK')
y = stock['涨跌幅’]
features = stock.loc[:,'价格':'流通市值’]
X = features.values
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=62)
#预处理
scaler = StandardScaler()
scaler.fit(X_train)
X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test)
sfm = SelectFromModel(estimator=RandomForestRegressor(n_estimators=100,random_state=38),threshold='median')
sfm.fit(X_train_scaled,y_train)
X_train_sfm = sfm.transform(X_train_scaled)
print('经过随机森林模型特征选择后的的数据形态:{}'.format(X_train_sfm.shape))
mask = sfm.get_support()
print(mask)
输出
经过随机森林模型进行特征后的的数据形态:(306, 8)
[False True False False False False True False False True True False True True True True]
模型选择:
1,随机森林,具有feature_importances_属性
2,L1线性模型,学习稀疏矩阵
#使用随机森林特征选择后数据集训练神经网络
X_test_sfm = sfm.transform(X_test_scaled)
mlp_sfm = MLPRegressor(random_state=53,hidden_layer_sizes=[100,100,100],alpha=0.1)
mlp_sfm.fit(X_train_sfm,y_train)
print('经过随机森林模型特征选择后训练集得分:{:.2%}'.format(mlp_sfm.score(X_train_sfm,y_train)))
print('经过随机森林模型特征选择后测试集得分:{:.2%}'.format(mlp_sfm.score(X_test_sfm,y_test)))
输出
经过随机森林模型特征选择后的数据形态:(306, 8)
[False True False False False False False True True True True True True True False]
经过随机森林模型特征选择后训练集得分:37.46%
经过随机森林模型特征选择后测试集得分:34.72%
直接处理 | univariate | SelectFromModel |
---|---|---|
47.47%:48.47% | 29.44%:18.36% | 37.46%:34.72% |
class sklearn.feature_selection.RFE(estimator, *, n_features_to_select=None, step=1, verbose=0, importance_getter='auto')
属性
属性 | 类型 | 解释 |
---|---|---|
estimator_ | Estimator instance | 用于选择特征的拟合估计量 |
n_features_ | Int | 选定要素的数量 |
ranking_ | ndarray of shape (n_features,) | 特征排名,使得ranking_[i]对应于第i特征的排名位置。选定的(即,估计的最佳)特征被分配为秩1 |
support_ | ndarray of shape (n_features,) | 选定特征的遮罩 |
方法
decision_function(X) | 计算X的决策函数。 |
---|---|
fit(X, y) | 对RFE模型进行拟合,然后对所选模型进行基础估计。 |
fit_transform(X[, y]) | 适应数据,然后转换它。 |
get_params([deep]) | 获取此估计器的参数。 |
get_support([indices]) | 获取所选特征的掩码或整数索引。 |
inverse_transform(X) | 反转转换操作。 |
predict(X) | 将X减少到选定的特征,然后使用。 |
predict_log_proba(X) | 预测X的类对数概率。 |
predict_proba(X) | 预测X的类概率。 |
score(X, y) | 将X减少到所选特征,然后返回所选特征的分数。 |
set_params(**params) | 设置此估计器的参数。 |
transform(X) | 将X减少到选定的特征。 |
from sklearn.feature_selection import RFE
def elimination():
stock = pd.read_csv('stock.csv',encoding='GBK’)
y = stock['涨跌幅’]
features = stock.loc[:,'价格':'流通市值’]
X = features.values
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=62)
#预处理
scaler = StandardScaler()
scaler.fit(X_train)
X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test)
rfe = RFE(RandomForestRegressor(n_estimators=100,random_state=38),n_features_to_select=8)
rfe.fit(X_train_scaled,y_train)
X_train_rfe = rfe.transform(X_train_scaled)
print('经过随机森林模型进行迭代特征选择后的的数据形态:{}'.format(X_train_rfe.shape))
mask = rfe.get_support()
print(mask)
print(mask)
#用图像表示特征选择结果
plt.matshow(mask.reshape(1,-1),cmap=plt.cm.cool)
plt.xlabel(u"特征选择")
plt.rcParams['font.sans-serif']=['SimHei’]
plt.rcParams['axes.unicode_minus']=False
plt.show()
经过随机森林模型进行迭代特征选择后的数据形态:(306, 8)
[False True False True False False False True False True True True True True False]
使用随机森林迭代特征选择后数据集训练随机森林
X_test_rfe = rfe.transform(X_test_scaled)
mlp_rfe = MLPRegressor(random_state=53,hidden_layer_sizes=[100,100,100],alpha=0.1)
mlp_rfe.fit(X_train_rfe,y_train)
print('经过随机森林迭代特征选择后训练集得分:{:.2%}'.format(mlp_rfe.score(X_train_rfe,y_train)))
print('经过随机森林迭代特征选择后测试集得分:{:.2%}'.format(mlp_rfe.score(X_test_rfe,y_test)))
输出
随机森林迭代特征选择后训练集得分:41.59%
经过随机森林迭代特征选择后测试集得分:43.61%
直接处理 | univariate | SelectFromModel | RFE |
---|---|---|---|
47.47%:48.47% | 29.44%:18.36% | 37.46%:34.72% | 41.59%:43.61% |