特征工程主要步骤

特征工程的主要步骤分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_

(未完)

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值