前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >快速入门Python机器学习(35)

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

作者头像
顾翔
发布2022-09-23 20:11:58
5960
发布2022-09-23 20:11:58
举报
文章被收录于专栏:啄木鸟软件测试

14.2数据表达与特征工程

14.2.1数据表达

哑变量:利用类似pd.get_dummies得到的0,1数据。

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

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

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

14.2.2 OneHotEncoder类

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

14.2.3装箱处理

代码语言:javascript
复制
#生成随机数列
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进行拟合

代码语言:javascript
复制
        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离散化处理,又称装箱处理

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

输出

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

输出

代码语言:javascript
复制
装箱后的数据形态:
(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个箱子)

代码语言:javascript
复制
#使用独热编码进行数据表达
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

对于基于决策树算法(随机森林,梯度上升决策树,决策树)没有效果

14.2.4 PolynomialFeatures类

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

将数据转换为多项式特征。

14.1.5 数据升维

统计建模方式:

  • 交互性特征(Interaction Feature);
  • 多项式特征(Polynomial Feature)。
1) 交互性特征(Interaction Feature)
代码语言:javascript
复制
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))

输出

代码语言:javascript
复制
将数组2添加到数据1后面去得到:
[0 1 2 3 4 5 6 7 8 9]
代码语言:javascript
复制
#将原始数据和装箱数据进行堆叠
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

输出

代码语言:javascript
复制
X.shape:
 (50, 1)
X_in_bin.shape:
 (50, 10)
X_stack.shape:
 (50, 11)
代码语言:javascript
复制
#将数据进行堆叠
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()

每一个箱子中的斜率加大了,但是斜率是一样的。

代码语言:javascript
复制
#使用新的叠堆方式处理数据
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])

输出

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

2)多项式特征(Polynomial Featur)

ax4+bx3+cx2+dx+e

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

输出

代码语言:javascript
复制
(50, 20)
代码语言:javascript
复制
print("原始数据第一个样本:\n {} ".format(X[0]))
print("多项式处理后第一个样本:\n{} ".format(X_poly[0]))
print("PolynomialFeatures对原始数据的处理:\n{}".format(poly.get_feature_names()))

输出

代码语言:javascript
复制
原始数据第一个样本:
[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']
代码语言:javascript
复制
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()

14.1.6 自动选择特征

自动选择特征

  • 使用单一变量法(Univariate)
  • 基于模型特征选择(SelectFromModel)
  • 迭代特征选择(RFE)
1) 使用单一变量法(Univariate) SelectPercentile类
代码语言:javascript
复制
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减少到选定的特征。

股票数据预处理

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

代码语言:javascript
复制
#设置目标
y = stock['涨跌幅']
print(y.shape)
print(y[0])
代码语言:javascript
复制
(408,)
-0.0252

408条数据

'涨跌幅'列第一个数据为:-0.0252

代码语言:javascript
复制
#提取特征值
features = stock.loc[:,'价格':'流通市值']
X = features.values
print(X.shape)
print(X[1])
代码语言:javascript
复制
(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个特征项

用神经网络进行处理

代码语言:javascript
复制
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)))
代码语言:javascript
复制
训练集得分:47.47%
测试集得分:48.47%

random_state,hidden_layer_sizes,alpha根据自身数据,调整到最优解

获取涨幅>=0.05的企业名称

代码语言:javascript
复制
wanted = stock.loc[:,'名称']
print(wanted[y>=-0.05])
代码语言:javascript
复制
0      当代文体
1      鼎通科技
2      澜起科技
3       苏博特
4      亿利洁能
       ... 
362    盟升电子
363    青海春天
364    瀚蓝环境
365     华润微
366    ST亚星
Name: 名称, Length: 367, dtype: object
代码语言:javascript
复制
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()
代码语言:javascript
复制
[False False False False False False False True True True True False True True True]

False (蓝色):过滤掉

True (粉色) :没有过滤掉

代码语言:javascript
复制
#使用特征选择后数据集训练神经网络
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)))

输出

代码语言:javascript
复制
单一变量法特征选择后训练集得分:29.44%
单一变量法特征选择后测试集得分:18.36%

噪音多得分上升,否则下降,所以适合噪音多数据

测试集得分: 48.47% -> 18.36 %

直接处理

univariate

47.47%:48.47%

29.44%:18.36%

2)基于模型特征选择(SelectFromModel)
代码语言:javascript
复制
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减少到选定的特征。

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

输出

代码语言:javascript
复制
经过随机森林模型进行特征后的的数据形态:(306, 8)
[False True False False False False True False False True True False True True True True]

模型选择:

1,随机森林,具有feature_importances_属性

2,L1线性模型,学习稀疏矩阵

代码语言:javascript
复制
#使用随机森林特征选择后数据集训练神经网络
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)))

输出

代码语言:javascript
复制
经过随机森林模型特征选择后的数据形态:(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%

3)迭代特征选择(RFE)
代码语言:javascript
复制
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减少到选定的特征。

代码语言:javascript
复制
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()
代码语言:javascript
复制
经过随机森林模型进行迭代特征选择后的数据形态:(306, 8)
[False True False True False False False True False True True True True True False]

使用随机森林迭代特征选择后数据集训练随机森林

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

输出

代码语言:javascript
复制
随机森林迭代特征选择后训练集得分:41.59%
经过随机森林迭代特征选择后测试集得分:43.61%

直接处理

univariate

SelectFromModel

RFE

47.47%:48.47%

29.44%:18.36%

37.46%:34.72%

41.59%:43.61%

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-09-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 14.2数据表达与特征工程
    • 14.2.1数据表达
      • 14.2.2 OneHotEncoder类
        • 14.2.3装箱处理
          • 14.2.4 PolynomialFeatures类
            • 14.1.5 数据升维
              • 1) 交互性特征(Interaction Feature)
              • 2)多项式特征(Polynomial Featur)
            • 14.1.6 自动选择特征
              • 1) 使用单一变量法(Univariate) SelectPercentile类
              • 2)基于模型特征选择(SelectFromModel)
              • 3)迭代特征选择(RFE)
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档