自动特征选择包括:单一变量法(univariate)、基于模型特征选择(SelectFromModel)和迭代特征选择(RFE)。
1单一变量法(univariate)
我们从网易财经频道下载股票交易数据,通过下面代码进行处理。
def dealdata(mydata): if str(mydata)[-1]=='%': try: return(float(str(mydata)[:-1])/100) except: return mydata elif str(mydata)[-1]=='万': try: returnfloat(str(mydata)[:-1])*10000 except: return mydata elif str(mydata)[-1]=='亿': try: returnfloat(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')
我们用处理好的stock.csv作为本文的学习数据。首先我们用pd.read_csv读取csv数据。
from sklearn.preprocessing import StandardScaler 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 [5rows 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, 16) [ 2.594e+01 -2.520e-02 -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条数据,提取16个特征项。接下来我们用进行MLPRegressor拟合
mlp =MLPRegressor(random_state=62,hidden_layer_sizes=[100,200,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)))
输出
训练集得分:96.12% 测试集得分:92.84%
注意:这里的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
单一变量法,使用sklearn.feature_selection.SelectPercentile类
from sklearn.feature_selection import SelectPercentile 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))
输出
经过缩放后的形态:(306, 16) 特征选择后的形态:(306, 8)
由于参数percentile=50,16个特征项成为了8个,50%被过滤掉了。通过布尔数组与图像来显示哪些数据被过滤,哪些数据没有被过滤
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 True True False False False False False True TrueFalse True False True True True]
第2、3、9、10、12、14、15、16(涨跌幅、涨跌额、成交量、成交额、量比、振幅、市盈率、流通市值)数据被保留,1、4、5、6、7、8、11、13(价格、5分钟涨跌额、今开、昨收、最高、最低、换手、委比)被抛弃。
使用特征选择后数据集训练神经网络。
X_test_selected= select.transform(X_test_scaled) mlp_select = MLPRegressor(random_state=62,hidden_layer_sizes=[100,200,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)))
输出
单一变量法特征选择后训练集得分:96.46% 单一变量法特征选择后测试集得分:96.24%
噪音多得分上升,否则下降,所以适合噪音多数据(如本文的数据)