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

目录

  • 1.特征工程
    • 1.1 预处理
    • 1.2 特征处理
    • 1.3 特征降维
      • 1.3.1 特征选择
      • 1.3.2 线性降维
  • 2.赛题代码
  • 3 结果显示

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——特征工程相关推荐

  1. 天池学习赛:工业蒸汽量预测5——特征优化

    上一篇<天池学习赛:工业蒸汽量预测4--模型验证> 目录 1 特征优化的方法 1.1 合成特征 1.2 特征变换 1.3 用决策树创造新特征 1.4 特征组合 2 赛题特征优化代码 1 特 ...

  2. 天池大赛之工业蒸汽量预测(有史以来最全面)

    目录 1.导包与数据挖掘 1.1导包 1.2 数据载入 1.3 数据合并 1.4 数据分布 1.5 特征清洗 1.6 特征可视化 1.7 相关性系数 1.8 归一化 1.9 Box-Cox变换对连续变 ...

  3. 天池比赛:工业蒸汽量预测

    https://tianchi.aliyun.com/competition/entrance/231693/introduction 偶然看到一句话:最重要的是提特征,特征决定上限,模型只是无限逼近 ...

  4. 天池学习赛:工业蒸汽量预测3——模型训练

    接上一篇<天池学习赛:工业蒸汽量预测2--特征工程> 数据划分: from sklearn.model_selection import train_test_split #切分数据new ...

  5. 天池学习赛:工业蒸汽量预测1——数据探索

    目录 0.赛题介绍 1.数据分析知识 2.代码实现 0.赛题介绍 火力发电的基本原理是:燃料在燃烧时加热水生成蒸汽,蒸汽压力推动汽轮机旋转,然后汽轮机带动发电机旋转,产生电能.在这一系列的能量转化中, ...

  6. 天池学习赛:工业蒸汽量预测4——模型验证

    上一篇<天池学习赛:工业蒸汽量预测3--模型训练>中已经是使用了几种机器学习的模型,接下来将介绍一些模型的评价方法. 目录 1 模型评估的方法 2 模型调参 3 赛题模型验证与调参 3.1 ...

  7. python建模大赛算法_Python数据分析kaggle-Titanic+天池-工业蒸汽量预测建模算法

    做数据分析许久了, 简单写写比赛的数据分析项目思路 一 使用逻辑回归/随机森林等对kaggle比赛项目 "给出泰坦尼克号上的乘客的信息, 预测乘客是否幸存"进行简单的数据分析过程, ...

  8. 【机器学习】阿里云天池竞赛——工业蒸汽量预测(2)

    机器学习经典赛题:工业蒸汽量预测(2) 机器学习经典赛题:工业蒸汽量预测(2) 3.1 特征工程的重要性和处理 3.2 数据预处理和特征处理 3.2.1 数据预处理 3.2.2 特征处理 3.3 特征 ...

  9. 【机器学习】阿里云天池竞赛——工业蒸汽量预测(4)

    机器学习经典赛题:工业蒸汽量预测(4) 机器学习经典赛题:工业蒸汽量预测(4):模型验证(模型评估与调参) 5.1 模型评估的概念和方法 5.1.1 欠拟合与过拟合 5.1.2 模型的泛化与正则化 5 ...

最新文章

  1. [原创]Coding4Fun检测你的网络,用C#获取本机TCP、UDP状态及连接(二)
  2. 《数值分析(原书第2版)》—— 第0章 基 础 知 识
  3. 【Google Play】App Bundle 使用详解 ( 简介 | 应用内更新 | 即时更新 | 灵活更新 )
  4. java 打包下载文件_java下载打包下载文件
  5. RabbitMQ知多少
  6. java正则表达式 ^expr 和 [^expr] 和 ^[^expr]的比较
  7. mysql 去重复屈居_mysql去重复关键字distinct的用法
  8. Exchange Server 2010证书(2)
  9. ireport中band指什么_金庸武侠经典书剑恩仇录中,“书剑”指的究竟是什么呢?...
  10. 网页转PDF 在线工具 输入网址获取PDF
  11. 数学建模更新10(蒙特卡罗模拟)
  12. OC Foundation框架 数组
  13. 2019大裁员!年关将至,最高裁员比例竟达90%?
  14. oracle 官网下载api,Oracle官网下载Java的api离线文档
  15. Kafka学习笔记 --- 生产者producer与消费者关系comsumer
  16. oracle numa map size mismatch,Oracle启动时提示map size mismatch; abort
  17. 2023年房地产地段研究报告
  18. 5.3. 虚拟存储管理------页面置换算法
  19. Java多线程/Java8多线程
  20. 90 后美女独家秘籍:从小白到 AI 算法工程师

热门文章

  1. 5g网络架构_【5G网络架构】系列之五:5G核心网向to B演进
  2. Matlab修改显示数值格式/精度/小数位数
  3. R语言中识别和去除重复行
  4. Altium AD20焊盘样式、热焊盘与反焊盘与直接连接
  5. 机器人领域会议期刊特点
  6. 红皮书--调试及修复
  7. Redis数据结构、持久化、缓存技术和集群详解
  8. MaxScale中间件部署数据库读写分离
  9. 有关 this 指向问题总结
  10. JS 获取随机颜色值