特征工程入门与实践_笔记_sklearn_python

目录

 

一、特征理解

1、定类数据

2、定序数据

3、定距数据

4、定比数据

二、清洗数据

1、识别缺失值

(1)删除缺失值的行

(2)填充缺失值(医学类数据禁用,因为要求真实)

2、标准化、归一化

三、特征构建

1、定类特征的填充

2、定量特征的填充

3、定类特征的编码

4、定序特征的编码

5、连续值分箱

6、扩展数值特征之多项式拟合

7、文本的特征构建

四、特征选择(减少坏属性) 

1、基于统计的特征的选择

(1)皮尔逊相关系数

(2)假设校验

2、基于模型的特征的选择 SelectFromModel

五、特征转换

1、主成分分析 PCA

2、线性判别分析LDA


一、特征理解

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)

sklearn api

流水线顺序:标准化 > PCA > LDA,一般后两个会一同使用

发布了134 篇原创文章 · 获赞 123 · 访问量 33万+

猜你喜欢

转载自blog.csdn.net/yfx000/article/details/103100818