天池学习赛:工业蒸汽量预测2——特征工程

上一篇《天池学习赛:工业蒸汽量预测1——数据探索》

1.特征工程

一般流程:
1.去掉无用特征
2.去掉冗余特征
3.利用存在的特征、特征转换、内容中的特征以及其他数据源生成新特征
4.特征转换(数值化、类别转换、归一化)
5.特征处理(异常值、最大值、最小值、缺失值)

1.1 预处理

数据采集,清洗,采样。正样本>负样本,若样本量特别大,采用下采样;正样本>负样本,若样本量不大,采用上采样(图像上的旋转镜像操作)

1.2 特征处理

采用sklearn自带数据库进行学习:

from sklearn.datasets import load_iris
iris=load_iris()

1 标准化

from sklearn.preprocessing import StandardScaler
StandardScaler().fit_transform(iris.data)

2 区间缩放法

from sklearn.preprocessing import MinMaxScaler
#将数据缩放到【0,1】区间上
MinMaxScaler().fit_transform(iris.data)

3 归一化

from sklearn.preprocessing import Normalizer
#返回归一化后的数据
Normalizer().fit_transform(iris.data)

4 定量特征二值化

from sklearn.preprocessing import Binarizer
#二值化,阈值设置为3  返回二值化后的数据
Binarizer(threshold=3).fit_transform(iris.data)

5 定性特征哑编码

from sklearn.preprocessing import OneHotEncoder
#将目标变量哑编码,返回编码后的数据
OneHotEncoder(categories='auto').fit_transform(iris.target.reshape(-1,1))

6 缺失值处理

from numpy import vstack,array,nan
from sklearn.impute import SimpleImputer
#缺失值处理,返回处理缺失值后的数据
#参数missing_value 为缺失值的形式,默认为NAN
#参数strategy为缺失值的填充方式,默认均值
SimpleImputer().fit_transform(vstack((array([nan,nan,nan,nan]),iris.data)))

7 数据转换
多项式转换:

from sklearn.preprocessing import PolynomialFeatures
#多项式转换
#参数degree为度,默认为2
PolynomialFeatures().fit_transform(iris.data)

对数转换:

from numpy import log1p
from sklearn.preprocessing import FunctionTransformer
#对数转换
#第一个参数是单变元函数
FunctionTransformer(log1p,validate=False).fit_transform(iris.data)

8 小结
在这里插入图片描述

1.3 特征降维

1.3.1 特征选择

采用sklearn自带数据库进行学习:

from sklearn.datasets import load_iris
iris=load_iris()

1 VarianceThreshold

from sklearn.feature_selection import VarianceThreshold
#方差选择法,返回为选择后的数据
#参数threshold为方差阈值
VarianceThreshold(threshold=3).fit_transform(iris.data)

2 SelectKBest
(1)相关系数法

from array import array
import numpy as np
from sklearn.feature_selection import SelectKBest
from scipy.stats import pearsonr
#选择k个最好的特征,返回值为选择后的数据
#第一个参数为计算评估特征的函数。该函数输入特征矩阵和目标向量,输出为二元组(评分,p值)的数组,
# 数组第i项为第i个的评分和p值(相关性系数)
SelectKBest(lambda X,Y:np.array(list(map(lambda x:pearsonr(x,Y),X.T))).T[0],k=2)\
    .fit_transform(iris.data,iris.target)

(2)卡方检验

from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
#选择最好的k个特征
SelectKBest(chi2,k=2).fit_transform(iris.data,iris.target)

(3)最大信息系数法

3 RFE

from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
#递归特征消除法
#参数estimator 为基模型
#参数n_features_to_select为选择的特征个数
RFE(estimator=LogisticRegression(multi_class='auto',\
                                 solver='lbfgs',\
                                 max_iter=500),\
    n_features_to_select=2).fit_transform(iris.data,iris.target)

4 SelectFromModel
(1) 惩罚项的逻辑回归作为基模型

from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import LogisticRegression
#将带L1惩罚项的逻辑回归作为基模型
SelectFromModel(LogisticRegression(penalty='12',\
                                   C=0.1,\
                                   solver='lbfgs',\
                                   multi_class='auto'\
                                   ).fit_transform(iris.data,iris.target)

(2) 基于树模型的特征选择

from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import GradientBoostingClassifier
#将GBDT基模型
SelectFromModel(GradientBoostingClassifier().fit_transform(iris.data,iris.target)

1.3.2 线性降维

1 主成分分析法

from sklearn.decomposition import PCA
PCA(n_components=2).fit_transform(iris.data)

2 线性判别分析

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
LDA(n_components=2).fit_transform(iris.data,iris.target)

2.赛题代码

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats
from sklearn import preprocessing
from statsmodels.stats.outliers_influence import variance_inflation_factor
from sklearn.decomposition import PCA
import warnings
warnings.filterwarnings("ignore")

train_data_file = "./zhengqi_train.txt"
test_data_file = "./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')

#异常值处理
#查看各个特征的箱线图
plt.figure(figsize=(18,10))
plt.boxplot(x=train_data.values,labels=train_data.columns)
plt.hlines([-7.5,7.5],0,40,colors='r')
plt.show()

#V9存在异常值,删除异常值
train_data=train_data[train_data['V9']>-7.5]
test_data=test_data[test_data['V9']>-7.5]
print(train_data.describe())
print(test_data.describe())

#最大值和最小值的归一化
features_columns=[col for col in train_data.columns if col not in ['target']]
min_max_scaler=preprocessing.MinMaxScaler()
min_max_scaler=min_max_scaler.fit(train_data[features_columns])
train_data_scaler=min_max_scaler.transform(train_data[features_columns])
test_data_scaler=min_max_scaler.transform(test_data[features_columns])
train_data_scaler=pd.DataFrame(train_data_scaler)
train_data_scaler.columns=features_columns
test_data_scaler=pd.DataFrame(test_data_scaler)
test_data_scaler.columns=features_columns
train_data_scaler['target']=train_data['target']
print(train_data_scaler.describe())
print(test_data_scaler.describe())

#查看数据的分布
#从数据预处理时我们发现'V5','V9','V11','V17','V22','V28'在训练集和测试集上的分布差异较大,影响模型的泛化性,故需要删除
drop_col=3
drop_row=2
plt.figure(figsize=(5*drop_col,5*drop_row))
for i,col in enumerate(['V5','V9','V11','V17','V22','V28']) :
    ax=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()

#计算相关性,以热力图形式可视化显示
plt.figure(figsize=(20,16))
column=train_data_scaler.columns.tolist()
mcorr=train_data_scaler[column].corr(method="spearman")
mask=np.zeros_like(mcorr,dtype=np.bool)
mask[np.triu_indices_from(mask)]=True
cmap=sns.diverging_palette(220,10,as_cmap=True)
g=sns.heatmap(mcorr,mask=mask,cmap=cmap,square=True,annot=True,fmt='0.2f')
plt.show()

#下面进行特征筛选,特征降维
mcorr=mcorr.abs()
numerical_corr=mcorr[mcorr['target']>0.1]['target']
print(numerical_corr.sort_values(ascending=False))

#对相关性系数进行排序显示
index0=numerical_corr.sort_values(ascending=False).index
print(train_data_scaler[index0].corr('spearman'))

#多重共线性分析
#原则是特征组之间的相关性过大的话,就会存在较大的共线性影响,导致模型的不准确,要后续用PCA对数据进行处理
#多重共线性
new_numerical=['V0','V2','V3','V4','V5','V6','V10','V11',\
               'V13','V15','V16','V18','V19','V20','V22',\
               'V24','V30','V31']   #里面的特征变量从相关性矩阵中得到并过滤筛选
x=np.matrix(train_data_scaler[new_numerical])
VIF_list=[variance_inflation_factor(x,i) for i in range(x.shape[1])]
print(VIF_list)

#PCA处理   去除数据的多重共线性
#保持90%的信息
pca=PCA(n_components=0.9)
new_train_pca_90=pca.fit_transform(train_data_scaler.iloc[:,0:-1])
new_test_pca_90=pca.transform(test_data_scaler)
new_train_pca_90=pd.DataFrame(new_train_pca_90)
new_test_pca_90=pd.DataFrame(new_test_pca_90)
new_train_pca_90['target']=train_data_scaler['target']
print('PCA处理后:\n',new_train_pca_90.describe())
print('PCA处理前:\n',train_data_scaler.describe())

#保存处理后的16个主成分(可以直接到上一步就够了)
pca=PCA(n_components=16)
new_train_pca_16=pca.fit_transform(train_data_scaler.iloc[:,0:-1])
new_test_pca_16=pca.transform(test_data_scaler)
new_train_pca_16=pd.DataFrame(new_train_pca_16)
new_test_pca_16=pd.DataFrame(new_test_pca_16)
new_train_pca_16['target']=train_data_scaler['target']
print(new_train_pca_16.describe())

3 结果显示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

下一篇《天池学习赛:工业蒸汽量预测3——模型训练》

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小屋*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值