特征工程的主要步骤分6步:
1.特征理解,学习如何识别定量数据和定性数据
2.特征增强,清洗和填充缺失值,最大化数据集的价值
3.特征构建,构建新的特征,探索特征间的联系
4.特征选择,通过统计方法选择一部分特征,以减少数据噪声
5.特征转换,提取数据中的隐藏结构,用数学方法转换数据集,增强效果
6.特征学习,用简单的神经网络学习特征
一、特征理解
假设数据已经使用pandas进行读取,变量名为df
import pandas as pd
#查看前几行数据,n默认值为5
df.head(n)
#查看整个数据表有多少行,是否有缺失值,以及每列的数据类型
df.info()
#另一种计算缺失值数量的方法
df.isnull().sum()
#显示描述性统计
df.describe()
数据可以分为四个等级:
等级 | 属性 | 描述性统计 | 图表 |
---|---|---|---|
定类 | 离散 无序 | 频率/占比,众数 | 条形图,饼图 |
定序 | 有序类别 比较 | 频率,众数,中位数,百分位数 | 条形图,饼图,茎叶图 |
定距 | 数字差别有意义 | 频率,众数,中位数,均值,标准差 | 条形图,饼图,茎叶图,箱线图,直方图 |
定比 | 连续 | 均值,标准差 | 直方图,箱线图 |
二、特征增强
一下均假设得到的数据集为df,x为df的自变量集合,y为df的因变量集合
1.删除无数据的行
df_dropped = df.dropna()
在删除了之后需要比较一下各列均值的变化
(df_dropped.mean() - df.mean())/df.mean()
2.填充缺失值
可以使用0或者均值进行填充
df_fill = df.fillna(value)
使用填充器填充
from sklearn.preprocessing import Imputer
imputer = Imputer(strategy="mean")
df_imputed = imputer.fit_transform(df)
#得出的是np.ndarray格式,需要再转成dataframe
df_imputed = pd.DataFrame(data=df_imputed,columns=df.columns)
3.参数搜索
使用参数搜索自动寻找最佳模型,假设这里尝试寻找参数最好的KNN模型
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCV
knn_params = {"n_neighbors":[1,2,3,4,5,6,7]}
knn = KNeighborsClassifier()
grid = GridSearchCV(knn,knn_params)
grid.fit(x,y)
#输出最佳模型得分,以及它的最佳参数个数
print(grid.best_score_,grid.best_params_)
4.机器学习流水线
使用流水线,可以将各个模块按照流水形式组装结合,对输入的数据进行处理
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import Imputer
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCV
imputer = Imputer(strategy="mean")
knn = KNeighborsClassifier()
mean_impute = Pipeline([("imputer",imputer),("classify",knn)])
knn_params = {"classify__n_neighbors":[1,2,3,4,5,6,7]}
grid = GridSearchCV(mean_impute,knn_params)
grid.fit(x,y)
print(grid.best_score_,grid.best_params_)
5.标准化和归一化
(1)z分数标准化,使得均值为0,标准差为1
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
(2)min-max标准化,使得所有值在0-1之间
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
(3)行归一化,使得每行的向量长度相同
from sklearn.preprocessing import Normalizer
normalize = Normalizer()
三、特征构建
1.自定义填充器
(1)自定义分类填充器
from sklearn.base import TransformerMixin
class CustomCategoryImputer(TransformerMixin):
def __init__(self,cols=None):
self.cols = cols
def transform(self,df):
X = df.copy()
for col in self.cols:
X[col].fillna(X[col].value_counts().index[0],inplace=True)
return X
def fit(self,*_):
return self
(2)自定义分量填充器
from sklearn.base import TransformerMixin
from sklearn.preprocessing import Imputer
class CustomCategoryImputer(TransformerMixin):
def __init__(self,cols=None,strategy="mean"):
self.cols = cols
self.strategy = strategy
def transform(self,df):
X = df.copy()
impute = Imputer(strategy=self.strategy)
for col in self.cols:
X[col] = impute.fit_transform(x[[col]])
return X
def fit(self,*_):
return self
2.编码分类变量
(1)定类等级的编码
class CustomDummiifer(TransformerMixin):
def __init__(self,cols=None):
self.cols = cols
def transform(self,X):
return pd.get_dummies(X,columns=self.cols)
def fit(self,*_):
return self
(2)定序等级的编码
class CustomEncoder(TransformerMixin):
def __init__(self,col,ordering=None):
self.ordering=ordering
self.col=col
def transform(self,df):
X = df.copy()
X[self.col] = X[self.col].map(lambda x:self.ordering.index(x))
return X
def fit(self,*_):
return self
3.扩展数值特征
(1)多项式特征
from sklearn.preprocessing import PolynomialFeatures
#degree为特征多项式的阶数,默认为2
#include_bias表示是否生成阶数为0的偏差列
#interaction_only表示是否只生成互相影响的特征
poly = PolynomialFeatures(degree=2,include_bias=False,interaction_only=False)
4.针对文本的特征构建
(1)词袋法
from sklearn.feature_extraction.text import CountVectorizer
#stop_words表示停用词
#min_df表示忽略文档中频率低于阈值的词
#max_df表示忽略文档中频率高于阈值的词
#ngram_range接收一个元组,表示词项n的长度(n个词的短语)
#analyzer表示用什么方法进行划分,默认是word,可以使用nltk里的词干法stemmer
vect = CountVectorizer(stop_words,min_df,max_df,ngram_range,analyzer)
(2)tf-idf向量化
from sklearn.feature_extraction.text import TfidfVectorizer
vect = TfidfVectorizer()
四、特征选择
1.基于统计的特征选择
(1)皮尔逊相关系数
#获得该dataframe的相关系数
corr = df.corr()
(2)假设检验
#选择k个最高分的特征
from sklearn.feature_selection import SelectKBest
#ANOVA测试
from sklearn.feature_selection import f_classif
#手动选择5个p值最小的特征
k_best = SelectKBest(f_classif,k=5)
#查看p值
k_best.pvalues_
2.基于模型的特征选择
(1)基于树模型
from sklearn.tree import DecisionTreeClassifier
tree = DecisionTreeClassifier()
tree.fit(X,y)
#查看决策树各特征重要性
tree.feature_importances_
根据阈值进行模型选择
from sklearn.feature_selection import SelectFromModel
#挑选出符合阈值的模型
select = SelectFromModel(model,threshold=0.2)
#模型所选的特征
select.get_support()
(2)正则化
分为L1正则化和L2正则化
from sklearn.preprocessing import Normalizer
#L1正则化
normalizer_L1 = Normalizer(norm="l1")
#L2正则化
normalizer_L2 = Normalizer(norm="l2")
五、特征转换
1.主成分分析,用于对原数据进行降维
from sklearn.decomposition import PCA
#表示主成分数为2
pca = PCA(n_components=2)
#得到的特征向量
pca.components_
#得到的特征值,也值就是每个主成分解释的方差量
pca.explained_variance_ratio_
2.线性判别分析,用于对数据分类划分出决策边界
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
#表示得到2个分类
lda = LinearDiscriminantAnalysis(n_components=2)
#类似于pca里的components_
lda.scalings_
#类似于pca里的主成分方差
lda.explained_variance_ratio_
(未完)