特征工程-特征预处理 | 更文挑战

279 阅读3分钟

“这是我参与更文挑战的第25天,活动详情查看: 更文挑战

什么是特征工程呢?一个非常简单的例子,现在出一非常简答的二分类问题题,请你使用逻辑回归,设计一个身材分类器。输入数据X:身高和体重 ,标签为Y:身材等级(胖,不胖)。显然,不能单纯的根据体重来判断一个人胖不胖,姚明很重,他胖吗?显然不是。针对这个问题,一个非常经典的特征工程是,BMI指数,BMI=体重/(身高^2)。这样,通过BMI指数,就能非常显然地帮助我们,刻画一个人身材如何。甚至,你可以抛弃原始的体重和身高数据。

1.特征工程定义:

通过一些转换函数将特征数据转换成更加适合算法模型的特征数据过程

2.包含内容

  • 归一化:对原始数据进行变换把数据映射到(默认为[0,1])之间
  • 标准化:对原始数据进行变换把数据变换到均值为0,标准差为1范围内

3.api

sklearn.preprocessing

先导入各类库

from sklearn.datasets import load_iris#,fetch_20newsgroups
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.model_selection import train_test_split
from pylab import *
mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei'] #用于解决中文显示问题

1.数据集获取

1.1 小数据集获取

iris = load_iris()

1.2 数据集属性描述

#print('数据集中特征值是:\n',iris.data)
#print('数据集中目标值是:\n',iris['target'])
#print('数据集中特征值名称是:\n',iris.feature_names)
#print('数据集中目标值名称是:\n',iris.target_names)
#print('数据集的描述是:\n',iris.DESCR)

1.3 数据类型转换,把数据用DataFrame存储

iris_data = pd.DataFrame(data=iris.data,columns=['Sepal_Length','Sepal_Width','Petal_Length','Petal_Width'])
iris_data['target']=iris.target

定义一个可视化函数 plot_iris:

def plot_iris(iris,col1,col2):
    sns.lmplot(x = col1,y=col2,data=iris_data,hue='target',fit_reg=False)
    plt.xlabel(col1)
    plt.ylabel(col2)
    plt.title('鸢尾花种类分布图')
    plt.show()

1.4 数据集的划分

x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target,test_size=0.2,random_state=2)#x为特征值,y为目标值
#print('训练集的特征值是:\n',x_train)
#print('测试集的特征值是:\n',x_test)
#print('训练集的目标值是:\n',y_train)
#print('测试集的目标值是:\n',y_test)

得到的结果是 训练集占80%,测试集占20%

image.png

归一化处理需要用到MinMaxScaler,这里我们直接导入

from sklearn.preprocessing import MinMaxScaler

还需要一个转换器,实例化一个转换器

transfer = MinMaxScaler(feature_range=(0,1))

调用fit_transfrom方法

minmax_data = transfer.fit_transform(data[['milage','Liters','Consumtime']])
print('经过归一化处理后的数据为:\n',minmax_data)

image.png

可以看出 归一化后的数据都是在0-1之间。

简单来说,标准化是依照特征矩阵的列处理数据,其通过求z-score的方法,将样本的特征值转换到同一量纲下。归一化是依照特征矩阵的行处理数据,其目的在于样本向量在点乘运算或其他核函数计算相似性时,拥有统一的标准,也就是说都转化为“单位向量”。规则为l2的归一化公式如下:

image.png

 使用preproccessing库的Normalizer类对数据进行归一化的代码如下:

from sklearn.preprocessing import Normalizer

#归一化,返回值为归一化后的数据
Normalizer().fit_transform(iris.data)