3.1 特征工程目标
数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。
本质是一项工程活动,目的是最大限度地从原始数据中提取特征以供算法和模型使用。
3.2 内容介绍
常见的特征工程包括:
1.特征理解
包括数据结构;定量和定性数据;数据等级等
2.数据增强/数据清洗
+ 识别缺失值
+ 处理缺失值
+ 标准化和归一化
3.特征构建
+ 检查数据集
+ 填充分类特征
+ 编码分类变量
+ 扩展数值特征
4.特征选择
+ 基于模型的选择
+ 基于统计的选择
5.特征转换
+ 维度缩减:特征转换、特征选择与特征构建
+ 主成分分析-PCA
+ 线性判别分析-LDA
6.特征学习
+ 数据的参数假设
+ 受限玻尔兹曼机
+ 伯努利受限玻尔兹曼机
+ RBM
+ Word Embedding
7. 评估特征工程的步骤:
- 在应用任何特征工程之前,得到机器学习模型的基准性能;
- 应用一种或多种特征工程;
- 对于每种特征工程,获取一个性能指标,并与基准性能进行对比;
- 如果性能的增量(变化)大于某个阈值(一般由我们定义),则认为这种特征工程是有益
的,并在机器学习流水线上应用;
- 性能的改变一般以百分比计算(如果基准性能从 40%的准确率提升到 76%的准确率,那
么改变是 90%)。
import pandas as pd
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import seaborn as sns
from operator import itemgetter
%matplotlib inline
path = './datalab/231784/'
Train_data = pd.read_csv('./datalab/231784/used_car_train_20200313.csv', sep=' ')
Test_data = pd.read_csv('./datalab/231784/used_car_testA_20200313.csv', sep=' ')
print(Train_data.shape)
print(Test_data.shape)
Train_data.head()
Train_data.columns
def outliers_proc(data, col_name, scale=3):
"""
用于清洗异常值,默认用 box_plot(scale=3)进行清洗
:param data: 接收 pandas 数据格式
:param col_name: pandas 列名
:param scale: 尺度
:return:
"""
def box_plot_outliers(data_ser, box_scale):
"""
利用箱线图去除异常值
:param data_ser: 接收 pandas.Series 数据格式
:param box_scale: 箱线图尺度,
:return:
"""
iqr = box_scale * (data_ser.quantile(0.75) - data_ser.quantile(0.25))
val_low = data_ser.quantile(0.25) - iqr
val_up = data_ser.quantile(0.75) + iqr
rule_low = (data_ser < val_low)
rule_up = (data_ser > val_up)
return (rule_low, rule_up), (val_low, val_up)
data_n = data.copy()
data_series = data_n[col_name]
rule, value = box_plot_outliers(data_series, box_scale=scale)
index = np.arange(data_series.shape[0])[rule[0] | rule[1]]
print("Delete number is: {}".format(len(index)))
data_n = data_n.drop(index)
data_n.reset_index(drop=True, inplace=True)
print("Now column number is: {}".format(data_n.shape[0]))
index_low = np.arange(data_series.shape[0])[rule[0]]
outliers = data_series.iloc[index_low]
print("Description of data less than the lower bound is:")
print(pd.Series(outliers).describe())
index_up = np.arange(data_series.shape[0])[rule[1]]
outliers = data_series.iloc[index_up]
print("Description of data larger than the upper bound is:")
print(pd.Series(outliers).describe())
fig, ax = plt.subplots(1, 2, figsize=(10, 7))
sns.boxplot(y=data[col_name], data=data, palette="Set1", ax=ax[0])
sns.boxplot(y=data_n[col_name], data=data_n, palette="Set1", ax=ax[1])
return data_n
from sklearn import preprocessing
min_max_scaler=preprocessing.MinMaxScaler()
#具体minmax的过程
data['power']=np.log(data['power']+1)
data['power']=((data['power']-np.min(data['power']))/np.max(data['power']-np.min(data['power'])))
data['power'].plot.hist()