蒸汽预测赛题之特征工程
天池大赛比赛地址:链接
理论知识
- 特征工程处理流程
- 去掉无用特征
- 去除冗余特征 比如共线特征
- 利用存在的特征、转换特征、内容中的特征生成新特征
- 特征转换:数值化、类别转换、归一化
- 特征处理 :异常值、最大值、最小值、缺失值
- 特征处理总结
类 | 功能 | 说明 |
---|---|---|
MinMaxScaler | 无量纲化 | 区间缩放,把特征转换到[0,1] |
StandardScaler | 无量纲化 | 特征转为正态分布 |
Normalizer | 归一化 | 样本转为单位向量,会改变原始距离、分布和信息 |
Binarizer | 定量特征二值化 | 按照给定阈值划分 |
OneHotEncoder | 定性特征哑变量 | 把定性特征编码为定量特征 |
Imputer | 缺失值处理 | 缺失值可填充为均值 |
PolynomialFeatures | 多项式数据转换 | 多项式数据转换 |
FunctionTransformer | 自定义单元函数转换 | 利用单变元函数转化数据 |
-
区间缩放法 MinMaxScaler
-
利用最大最小值进行缩放
-
x = (x-最小值)/(最大值-最小值)
-
是归一化的一种
-
from sklearn.preprocessing import MinMaxScaler MinMaxScaker().fit_transform(data)
-
-
标准化 StandardScaler
-
把特征转化为标准正态分布,并和整体样本分布相关
-
需要特征的均值和标准差
-
x = (x-均值)/标准差
-
from sklearn.preprocessing import StandardScaler StandardScaler().fit_transform(data)
-
-
归一化 单位向量 Normalizer
-
把样本的特征值 转换到 同一量纲
-
会改变数据的原始距离、分布和信息 标准化一般不回
-
from sklearn.preprocessing import Normalizer Normalizer().fit_transform(data)
-
-
归一化和标准化实用场景
- 对输出结果范围有要求 归一化
- 数据比较稳定 归一化
- 数据存在较多异常和较多噪声 标准化
- SVM、KNN、PCA模型需要数据归一化或者标准化
-
定量特征二值化 Binarizer
-
设定阈值 threshold 大于阈值为1 小于为0
-
from sklearn.preprocessing import Binarizer Binarizer(threshold=3).fit_transform(data)
-
-
哑变量 OneHotEncoder
-
把原来不能定量处理的变量进行量化
-
通常将原始的多分类变量转化为哑变量
-
定性特征哑变量
-
from sklearn.preprocessing import OneHotEncoder OneHotEncoder(categories='auto').fit_transform(data) encoder = OneHotEncoder(dropLast='false',inputCol='pid_feature',outputCol='pid_value')
-
-
缺失值处理 SimpleImputer
-
from sklearn.impute import SimpleImputer SimpleImputer.fit_transform()
-
-
多项式转换 PolynomialFeatures
-
4个特征值 度为2的多项式转换公式 默认为2
-
from sklearn.preprocessing import PolynomialFeatures PolynomialFeatures(degree=2).fit_transform(data)
-
-
对数转换 FunctionTransformer
-
自定义单元函数转换
-
from sklearn.preprocessing import FunctionTransformer # 第一个是单元变化函数 FunctionTransformer(np.log1p,vaildate=False).fit_transform(data)
-
-
特征降维
- 特征选择
- 线性降维
-
特征选择
- 特征是否发散 如果不发散 方差接近于0 样本在这个特征上基本没有差异 对样本区分无作用
- 特征与目标的相关性 选择相关性高的
-
特征选择总计
类 所属方法 具体方法 VarianceThreshold Filter 方差选择法 SelectKBest Filter 可选择相关性系数、卡方检验或最大信息系数作为得分计算 RFE Wrapper 递归消除特征 SelectFromModel Embedded 基于模型的特征选择 - 过滤法
- 按照发散性、相关性 通过设定阈值选择个数
- 相关系数、卡方检验、信息增益
- 包装法
- 通过目标函数决定是否加入一个变量
- 迭代产生特征子集 评价 完全、启发、随机搜索
- 嵌入法
- 学习期间自身自动选择特征 通过训练确定特征的权值系数
- 正则化 L1 L2
- 决策树 熵、信息增益
- 过滤法
-
方差选择法 Variance Threshold
-
计算特征的方差 并根据阈值选择
-
属于过滤法中一种
-
from sklearn.feature_selection import VarianceThreshold VarianceThreshold(threshold=3).fit_transform(data)
-
-
作为得分的计算方法
-
相关系数法 pearsonr
-
皮尔逊相关系数 参考链接(余弦计算之前两个向量都先进行中心化)
-
from sklearn.feature_selection import SelectKBest from scipy.stats import pearsonr ''' SelectKBest 第一个参数为计算评估特征的函数 输入目标矩阵和目标向量 输出二元组 评分和P值 第i项为第i个特征的评分和P值 第二个参数 k=2 取前两个最相关的 ''' SelectKBest(lambda X,Y :np.array(list(map(lambda x:pearsonr(x,Y),X.T))).T[0],k=2) .fit_transform(data,targrt)
-
卡方检验 chi2
-
检验定性自变量和定性应变量 考虑自变量i和应变量j的样本频数的观察值与期望的差距
-
from sklearn.feature_selection import SelectKBest from sklearn.feature_selection import chi2 SelectKBest(chi2,k=2).fit_transform(data,targrt)
-
最大信息系数法 mine 互信息
-
from sklearn.feature_selection import SelectKBest from minepy import MINE # 需要把mic方法转为函数式 返回二元组 第2项设为默认值P值为0.5 def mic(x,y): m = MINE() m.compute_score(x,y) return (m.mic(),0.5) SelectKBest(lambda X,Y:np.array(list(map(lambda x:mic(x,Y),X.T))).T[0],k=2) .fit_transform(data,target)
-
-
递归消除特征法 RFE
-
用一个基模型来进行多轮训练 没轮训练后 消除若干权值系数的特征
-
基模型采用LogisticRegression 参考链接
-
from sklearn.linear_model import LogisticRegression from sklearn.feature_selection import RFE RFE(estimator=LogisticRegression(multi_class='auto', solver='lbfgs', max_iter=500), n_features_to_select=2).fit_transform(data,target)
-
-
基于模型的特征选择法
-
基于惩罚项的特征选择
-
from sklearn.linear_model import LogisticRegression from sklearn.feature_selection import SelectFromModel SelectFromModel(LogisticRegression(penlty='l2',C=0.1,slover='lbfgs', multi_class='auto')).fit_transform(data,target)
-
基于树模型的特征选择
-
from sklearn.ensembel import GradientBoostingClassifier from sklearn.feature_selection import SelectFromModel SelectFromModel(GradientBoostingClassifier()).fit_transform(data,target)
-
-
线性降维
-
主成分分析 PCA
-
将高维数据映射到低纬空间,并期望在所投影的维度上数据的方差最大,以此达到使用最少数据维度保留原数据特点的效果 在此过程中可能会舍弃原有数据、创造新的变量
-
from sklearn.decomposition import PCA # n_components为主成分的数目 PAC(n_components=2).fit_transform(data)
-
线性判别分析法 LDA Linear Discriminant Analysis 也称FLD Fisher Linear Discriminant
-
目标是使降维后的数据点尽可能地容易被区分,用了标签的信息
-
原始线性数据为X 希望找到映射向量a 使ax
- 同类数据点 尽可能接近
- 不同类 尽可能分开
-
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA # n_components为主成分的数目 LDA(n_components=2).fit_transform(data)
-
1. 导包并载入数据
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats
import warnings
warnings.filterwarnings("ignore")
%matplotlib inline
train_data_file = "../datasets/zhengqi_train.txt"
test_data_file = "../datasets/zhengqi_test.txt"
train_data = pd.read_csv(train_data_file, sep='\t', encoding='utf-8')
test_data = pd.read_csv(test_data_file, sep='\t', encoding='utf-8')
2. 异常值分析
plt.figure(figsize=(18,10),dpi=200)
plt.boxplot(x=train_data.values,labels=train_data.columns)
plt.show()
- 删除特别明显的异常值
train_data = train_data[train_data['V9']>-7.5]
test_data = test_data[test_data['V9']>-7.5]
display(train_data.describe())
display(test_data.describe())
3. 最大值和最小值的归一化 MinMaxScaler
from sklearn.preprocessing import MinMaxScaler
feature_columns = [col for col in train_data if col not in ['target']]
min_max_scaler = MinMaxScaler().fit(train_data[feature_columns])
train_data_scaler = min_max_scaler.transform(train_data[feature_columns])
test_data_scaler = min_max_scaler.transform(test_data[feature_columns])
# 转为DataFrame 并添加tagret
train_data_scaler = pd.DataFrame(train_data_scaler,columns=feature_columns)
train_data_scaler['target'] = train_data['target']
test_data_scaler = pd.DataFrame(test_data_scaler,columns=feature_columns)
display(train_data_scaler.describe())
display(test_data_scaler.describe())
4. 查看数据分布 kde
- 在数据探索中出现 特征变量[‘V5’,‘V9’,‘V11’,‘V17’,‘V22’,‘V27’] kde曲线异常
drop_col = 3
drop_row = 2
plt.figure(figsize=(5*drop_col,5*drop_row))
drop_feature = ['V5','V9','V11','V17','V22','V27']
for i,col in enumerate(drop_feature):
plt.subplot(drop_row,drop_col,i+1)
ax = sns.kdeplot(train_data_scaler[col],color='red',shade=True)
ax = sns.kdeplot(test_data_scaler[col],color='blue',shade=True)
ax.set_xlabel(col)
ax.set_ylabel("Frequency")
ax = ax.legend(['train','test'])
plt.show()
5. 特征相关性 heatmap
plt.figure(figsize=(20,16),dpi=200)
columns = train_data_scaler.columns.tolist()
mcorr = train_data_scaler[columns].corr(method='spearman')
# 上半部分(triu_indices_from)不显示 mask中为True的在热力图中不显示
mask = np.zeros_like(mcorr,dtype=np.bool)
mask[np.triu_indices_from(mask)]=True
# 建立发散调色板 as_camp=true,返回一个colormap 而不是一个颜色列表。
cmap = sns.diverging_palette(h_neg=220,h_pos=10,as_cmap=True)
# square 是否正方形 annot 是否写入数据值
sns.heatmap(mcorr,mask=mask,cmap=cmap,square=True,annot=True,fmt='0.2f')
plt.show()
在这里插入图片描述
6. 特征降维 相关系数 > 0.1
- 计算相关性系数大于0.1的特征变量
mcorr = abs(mcorr)
numerical_corr = mcorr[mcorr['target']>0.1]['target']
corr_top_index = numerical_corr.sort_values(ascending=False).index
print(corr_top_index)
7. PCA处理
- 保持95%的信息数据
from sklearn.decomposition import PCA
pca = PCA(n_components=0.95)
new_train_pca_95 = pca.fit_transform(train_data_scaler.iloc[:,:-1])#除去target
new_train_pca_95 = pd.DataFrame(new_train_pca_95)
new_train_pca_95['target'] = train_data_scaler['target']
new_test_pca_95 = pca.transform(test_data_scaler)
new_test_pca_95 = pd.DataFrame(new_test_pca_95)
new_train_pca_95.describe()
- 保留16个主成分
from sklearn.decomposition import PCA
pca = PCA(n_components=16)
new_train_pca_16 = pca.fit_transform(train_data_scaler.iloc[:,:-1])
new_train_pca_16 = pd.DataFrame(new_train_pca_16)
new_train_pca_16['target'] = train_data_scaler['target']
new_test_pca_16 = pca.transform(test_data_scaler)
new_test_pca_16 = pd.DataFrame(new_test_pca_16)
new_train_pca_16.describe()