从事数据分析工作的过程中,我渐渐发现,数据分析结果的好坏往往与初始的数据质量有极大的关联,一份干净的数据能够让你专注数据算法方面的工作,而在这之前,数据清洗与特征工程占据我们60%的时间,下面我们一起来学习一下数据表示与特征工程:
特征工程:对于某个特定的应用来说,如何找到最佳数据表示。
1、分类变量
1.1 One-Hot编码(虚拟变量)
方法:使用Pandas pd.get_dummies(data)
本次依然使用足彩数据集
import pandas as pd import numpy as np from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_split df = pd.read_csv('C:/Users/5393/Desktop/fufei_test.csv', encoding='gb2312') df2 = df[['日期', '时间', '投注玩法', '投注额', '联赛', '赔率', '状态']] df2['投注玩法'] = df2['投注玩法'].map(lambda x:x.replace('?', '')) df3 = df2[['投注玩法', '投注额', '联赛', '赔率', '状态']] df3[['投注额', '赔率']] = df3[['投注额', '赔率']].astype(np.float16) # 改编数据类型 df3['状态'] = df3['状态'].astype(str) df['联赛'].value_counts() # 查看每个类别的个数 data_dummies = pd.get_dummies(df3) # 使用one-hot编码 features = data_dummies.loc[:, '投注额':'联赛_韩国K甲组联赛'] X = features.values y = data_dummies['状态_3'].values print(X.shape) print(y.shape) X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0) logreg = LogisticRegression(solver='liblinear') logreg.fit(X_train,y_train) score = logreg.score(X_test, y_test) score
2、分箱、离散化、线性模型与树
数据表示的最佳方法取决于:
- 数据的语义
- 使用的模型种类
bins = np.linspace(10,90,10) which_bin = np.digitize(line2, bins=bins) which_bin
分箱使线性模型变得更灵活,但不适用语树的模型。因为树本身可以学习在任何位置划分数据。
使用现象模型:
- 数据集较大
- 维度较高 对于特征与输入的关系是非线性的,用分箱可以提高建模能力。
3、交互特征与多项式特征
通常用于统计建模,也用于机器学习应用。
交互特征类(乘积特征): 箱子指示符与原始特征的乘积
多项式特征
from sklearn.preprocessing import PolynomilFeatures poly = PolynomialFeatures(degree=10, include_bias=False) poly.fit(df_fx1) fx1_poly = poly.transform(df_fx1) fx1_poly.shape fx1_poly[:1,] poly.get_feature_names() # 查看特征名称
将多项式与线性回归模型一起使用,得到多项式回归模型,适用于简单回归模型,不适用于随机森林等复杂模型。
4、单变量非线性变换
如果特征和目标之间不具有线性关系,需要调节数据相对比例;
- 线性模型、神经网络:log,exp(指数函数:np.exp())
- 周期性模式数据:sin,cos
首先使用散点图判断特征与目标之前的关系。
5、自动化特征选择
如何判断每个特征的祖宗用有多大:
- 单变量统计
- 基于模型的选择
- 迭代选择
5.1 单变量统计
计算每个特征和目标之间的关系,对于分类问题也被称为方差分析,只单独考虑每个特征,如果一个特征和其他特征合并之后才具有信息量,那么这个特征将会被舍弃。
from sklearn.feature_selection import SelectPercentile df = pd.read_csv('C:/Users/5393/Desktop/fufei_test.csv', encoding='gb2312') use_columns = [x for x in df.columns if x not in ['状态', '日期','时间']] X = df[use_columns].values y = df['状态'].values X_train, X_test, y_train, y_test = train_test_split(X,y,random_state=0) select = SelectPercentile(percentile=50) select.fit(X_train, y_train) x_train_select = select.transform(X_train) print(X_train.shape) print(x_train_select.shape)
5.2 基于模型的特征选择
模型的特征选择用一个监督机器学习下模型来判断每个特征的重要性,并且保留重要特征,特征选择模型可以和最终的监督建模模型不同,基于树的模型提供了feature_importances_属性。
from sklearn.feature_selection import SelectFromModel from sklearn.ensemble import RandomForestClassifier select = SelectFromModel(RandomForestClassifier(n_estimators=100, random_state=42), threshold='median') select.fit(X_train, y_train) x_train_l1 = select.transform(X_train) print(x_train_l1.shape)
5.3 迭代特征选择
迭代特征算则中,构建一系列模型,每个模型选择不同的特征数量,两种方法:
- 开始时没有特征,逐渐添加,直到满足条件,计算成本较高;
- 递归特征消除,用所有特征构建模型,删除不重要特征,再用接下来的特征重复操作,直到满足条件。
from sklearn.feature_selection import RFE from sklearn.ensemble import RandomForestClassifier select = RFE(RandomForestClassifier(n_estimators=100, random_state=42),n_features_to_select=40) # 对模型训练40次 select.fit(X_train, y_train) x_train_rfe = select.transform(X_train) print(x_train_rfe.shape)