目录
一、特征理解
1、定类数据
只能按名称分类,例如:血型的A、B、O、AB,不可以进行数学加减操作,可通过条形图bar、饼图pie分析
df['Grade'].value_counts().sort_values(ascending=False).head(20).plot(kind='bar')
df是python中的dataframe,类似于数据库表的结构,之后都是基于python和pandas的语法不再复述
2、定序数据
同样是类别,但是可以自然排序。例如考试成绩的ABCD,餐厅评分1-5,可通过条形图、饼图分析
df['Grade'].value_counts().plot(kind='pie')
3、定距数据
数值数据,不仅能排序,而且还能加减,例如气温,可以计算两地区夏季平均温度的差,可以通过直方图hist、箱线图box
df['Grade'].hist()
df['Grade'].value_counts().plot(kind='box')
4、定比数据
数值数据,不仅能排序、加减,还能乘除,例如100元钱是50元钱的2倍,旧金山各岗位工资中最高工资除以最低工资的13倍
可以通过直方图hist、箱线图box
二、清洗数据
先查看df.head()
再查看空准率(如果分类任务,那么就是各类别占比,模型要准确度高于这个才行,否则盲猜主类准确率都是空准率)
(如果是回归任务,可以看下平均值,并可以计算下平均值对应的R方或平均误差,作为后续对比参考)
df['要预测的列名'].value_counts(normalize = True)
1、识别缺失值
df.isnull().sum(),查看缺失值
df.describe(),有些数据最小值是0,但是违背常识,比如BMI指数
df['列名'] = df['列名'].map(lambda x:x if x != 0 else None) # 0 替换为 None
处理方法如下:
(1)删除缺失值的行
df.dropna()
然后要再看下空准率和平均值,数据分布不变是最好
(2)填充缺失值(医学类数据禁用,因为要求真实)
df['某列'].fillna( df['某列'].mean() , inplace=True)
或使用
training_mean = X_train.mean()
X_train = X_train.fillna( training_mean )
X_test = X_test.fillna( training_mean )
如上更诚实表达了泛化能力,因为从训练集特征中学习并应用到未知隐藏数据上
2、标准化、归一化
z分数标准化:StandardScaler
min-max标准化:MinMaxScaler
归一化:Normalizer
三、特征构建
1、定类特征的填充
针对Nan的列,填充类别频数最高的那个类别,
df['列名'].fillna( df['列名'].value_counts().index[0] , inplace = True)
2、定量特征的填充
可参考上面的均值(mean)填充,或使用Imputer工具类
3、定类特征的编码
X = pd.get_dummies(X)
X = pd.get_dummies(X , columns = ['列名','列名2'])
4、定序特征的编码
ordering = {'IV':45,'IIIA':32,'IIB':25,'IA':12,'IIIB':35,'IB':15,'IIA':22,'I':16}
df['AJCC阶段'] = df['AJCC阶段'].replace(ordering)
5、连续值分箱
X['年龄'] = pd.cut( X['年龄'] , bins = 3) //标签是区间段名:(67.4, 77.3]
df['年龄'] = pd.cut( df['年龄'] , bins = 10 , labels=False) //标签是排序的数值
6、扩展数值特征之多项式拟合
PolynomialFeatures 创建新特征,是原始特征的多项式组合
原特征是a、b , 新特征是 a、b、a平方、b平方、a*b、1
7、文本的特征构建
(1)词袋法 feature_extraction
(2)词向量 CountVectorizer
(3)词频逆文档频率 TF-IDF
四、特征选择(减少坏属性)
1、基于统计的特征的选择
(1)皮尔逊相关系数
df.corr() 特征两两之间,会有一个[-1,1]的数值,0代表没有线性相关,-1或1代表线性关系很强
df.corr()['目标列'] 查看特征与目标值间的相关性,一般取系数的绝对值>0.2 或0.1的特征
columns_names = df.cloumns[df.corr()['预测列'].abs() > 0.2]
columns_names = columns_names.drop('预测列')
X = X[columns_names]
(2)假设校验
from sklearn.feature_selection import SelectKBest,f_classif
f_classif 可以用负数,但不是所有类都支持
chi2 卡方也很常用,只支持正数
假设“特征与响应变量没有关系”,p值越低,那么这个特征与响应变量关系越大,p介于0-1,常见阈值0.05
(p不是越小越好,不能互相比较)
2、基于模型的特征的选择 SelectFromModel
引入包装器SelectFromModel 类似于 SelectKBest,也是用来选取重要特征,但不用入参k(保留特征数),入参是阈值
from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import LassoCV
clf = LassoCV()
sfm = SelectFromModel(clf, threshold=0.25)
sfm.fit(X, y)
上面的模型也可以换成决策树,那么就是使用的决策树的内部指标tree.feature_importan ces_来评估重要性
下面代码查看,最终选了哪些特征
pd.DataFrame(X.columns.tolist())[sfm.get_support()]
五、特征转换
1、主成分分析 PCA
将多个相关特征的数据集投影到相关特征较少的坐标系上,PCA利用协方差矩阵的特征值分解实现
from sklearn.decomposition import PCA
pca = PCA(n_components=3)
pca.fit(X)
2、线性判别分析LDA
和PCA一样,LDA目标也是提取一个新的坐标系,区别是LDA不会专注于数据的方差,而是优化低维空间,获得最佳类别可分性,有助于避免机器学习流水线的过拟合。
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
lda = LinearDiscriminantAnalysis(n_components=2)
X_r2 = lda.fit(X, y).transform(X)
流水线顺序:标准化 > PCA > LDA,一般后两个会一同使用