蒸汽预测赛题——特征工程

天池大赛比赛地址:链接

理论知识

  • 特征工程处理流程
    • 去掉无用特征
    • 去除冗余特征 比如共线特征
    • 利用存在的特征、转换特征、内容中的特征生成新特征
    • 特征转换:数值化、类别转换、归一化
    • 特征处理 :异常值、最大值、最小值、缺失值
  • 特征处理总结
功能说明
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 样本在这个特征上基本没有差异 对样本区分无作用
    • 特征与目标的相关性 选择相关性高的
  • 特征选择总计

    所属方法具体方法
    VarianceThresholdFilter方差选择法
    SelectKBestFilter可选择相关性系数、卡方检验或最大信息系数作为得分计算
    RFEWrapper递归消除特征
    SelectFromModelEmbedded基于模型的特征选择
    • 过滤法
      • 按照发散性、相关性 通过设定阈值选择个数
      • 相关系数、卡方检验、信息增益
    • 包装法
      • 通过目标函数决定是否加入一个变量
      • 迭代产生特征子集 评价 完全、启发、随机搜索
    • 嵌入法
      • 学习期间自身自动选择特征 通过训练确定特征的权值系数
      • 正则化 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()

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值