2)多项式特征(Polynomial Featur)
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()
14.1.6 自动选择特征
自动选择特征
- 使用单一变量法(Univariate)
- 基于模型特征选择(SelectFromModel)
- 迭代特征选择(RFE)
1)使用单一变量法(Univariate) SelectPercentile类
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% |
2)基于模型特征选择(SelectFromModel)
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% |
3)迭代特征选择(RFE)
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% |