scikit_learn(sklearn)数据预处理

数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。那特征工程到底是什么呢?顾名思义,其本质是一项工程活动,目的是最大限度地从原始数据中提取特征以供算法和模型使用。通过总结和归纳,人们认为特征工程包括以下方面:

《scikit_learn(sklearn)数据预处理》 image.png

博客转载
[ http://blog.csdn.net/u010472823/article/details/53509658 ]

数据预处理实战

官方文档 [ http://scikit-learn.org/stable/modules/preprocessing.html]

CountryAgeSalaryPurchased
France4472000No
Spain2748000Yes
Germany3054000No
Spain3861000No
Germany40Yes
France3558000Yes
Spain52000No
France4879000Yes
Germany5083000No
France3767000Yes

首先,有上述表格可以发现,样例数据中存在缺失值。 一般删除数据或补全数据。在缺失值补全之前,这里需要理解三个概念,众数,均值,中位数。
众数:数据中出现次数最多个数
均值:数据的求和平均。
中位数:数据排序后的中间数据。
具体选择类中类型填充需要依据场景选择。

首先,我们需要导入sklearn 中的Imputer 类,在sklearn 的 preprocessing 包下

from sklearn.preprocessing import Imputer
imp = Imputer(missing_values='NaN', strategy='mean', axis=0)
X[:,1:3] = imputer.fit(X[:,1:3]).transform(X[:,1:3])

strategy采用均值策略,填补上述数据中的2,3 两列。axis = 0指列

strategy : string, optional (default="mean")
        The imputation strategy.
        - If "mean", then replace missing values using the mean along
          the axis.
        - If "median", then replace missing values using the median along
          the axis.
        - If "most_frequent", then replace missing using the most frequent
          value along the axis.
>>> print(X)
[['France' 44.0 72000.0]
 ['Spain' 27.0 48000.0]
 ['Germany' 30.0 54000.0]
 ['Spain' 38.0 61000.0]
 ['Germany' 40.0 63777.77777777778]
 ['France' 35.0 58000.0]
 ['Spain' 38.77777777777778 52000.0]
 ['France' 48.0 79000.0]
 ['Germany' 50.0 83000.0]
 ['France' 37.0 67000.0]]

这里采用均值的策略补全了缺失数据。

由于X[0],y是类别数据,需要进行标签编码,采用sklearn .preprocessing包下的LabelEncoder.

from sklearn.preprocessing import LabelEncoder

>>>  X[:,0] = LabelEncoder().fit_transform(X[:,0])
>>>  y = LabelEncoder().fit_transform(y)
>>>  print(y)
[0 1 0 0 1 1 0 1 0 1]

对于预测值采用标签编码是没有问题的,然而,在类目特征中,标签编码转换是不够的,国家一列,特征按照0-2顺序编码,这里还需要对数据进行亚编码,one-hot encoding. 采用sklearn.preprocessing 包下的 OneHotEncoder

from sklearn.preprocessing import OneHotEncoder

>>> X = OneHotEncoder(categorical_features=[0]).fit_transform(X).toarray()
>>> print(X)

[[  1.00000000e+00   0.00000000e+00   0.00000000e+00   4.40000000e+01
    7.20000000e+04]
 [  0.00000000e+00   0.00000000e+00   1.00000000e+00   2.70000000e+01
    4.80000000e+04]
 [  0.00000000e+00   1.00000000e+00   0.00000000e+00   3.00000000e+01
    5.40000000e+04]
 [  0.00000000e+00   0.00000000e+00   1.00000000e+00   3.80000000e+01
    6.10000000e+04]
 [  0.00000000e+00   1.00000000e+00   0.00000000e+00   4.00000000e+01
    6.37777778e+04]
 [  1.00000000e+00   0.00000000e+00   0.00000000e+00   3.50000000e+01
    5.80000000e+04]
 [  0.00000000e+00   0.00000000e+00   1.00000000e+00   3.87777778e+01
    5.20000000e+04]
 [  1.00000000e+00   0.00000000e+00   0.00000000e+00   4.80000000e+01
    7.90000000e+04]
 [  0.00000000e+00   1.00000000e+00   0.00000000e+00   5.00000000e+01
    8.30000000e+04]
 [  1.00000000e+00   0.00000000e+00   0.00000000e+00   3.70000000e+01 
    6.70000000e+04]]

在回归情况下,我们需要对特征值进行缩放,年龄和薪酬是属于不同量集的。

from sklearn.preprocessing import StandardScaler
sd = StandardScaler().fit(X)
X = sd.transform(X)
print(X)
[[  1.22474487e+00  -6.54653671e-01  -6.54653671e-01   7.58874362e-01
    7.49473254e-01]
 [ -8.16496581e-01  -6.54653671e-01   1.52752523e+00  -1.71150388e+00
   -1.43817841e+00]
 [ -8.16496581e-01   1.52752523e+00  -6.54653671e-01  -1.27555478e+00
   -8.91265492e-01]
 [ -8.16496581e-01  -6.54653671e-01   1.52752523e+00  -1.13023841e-01
   -2.53200424e-01]
 [ -8.16496581e-01   1.52752523e+00  -6.54653671e-01   1.77608893e-01
    6.63219199e-16]
 [  1.22474487e+00  -6.54653671e-01  -6.54653671e-01  -5.48972942e-01
   -5.26656882e-01]
 [ -8.16496581e-01  -6.54653671e-01   1.52752523e+00   0.00000000e+00
   -1.07356980e+00]
 [  1.22474487e+00  -6.54653671e-01  -6.54653671e-01   1.34013983e+00
    1.38753832e+00]
 [ -8.16496581e-01   1.52752523e+00  -6.54653671e-01   1.63077256e+00
    1.75214693e+00]
 [  1.22474487e+00  -6.54653671e-01  -6.54653671e-01  -2.58340208e-01
    2.93712492e-01]]

其他标准化缩放方法 如MinMaxScaler() 区间缩放。

>>> min_max_scaler = preprocessing.MinMaxScaler()
>>> X = min_max_scaler.fit_transform(X)

归一化方法 Normalizer(),将特征向量长度归一到单位向量。

>>> normalizer = preprocessing.Normalizer().fit(X)  # fit does nothing
>>> normalizer.transform(X)

到此,基本的数据预处理到此完成,接下来就是模型训练和预测拉~

其余的一些操作
#df之间合并
df = pd.concat([df1,df2])
#查看df的信息
df.info()
#查看各个维度的统计数据,各个对象名称
df.describe()
df.describe(include=’o’).columns
#统计某个维度的个数
print train_df[‘column_name’].value_counts()
#属性列删除
df= df.drop([‘Name’], axis=1)
#删除列中重复数据,删除某一列重复的数据
df = df.drop_duplicates()
df = df.drop_duplicates(‘columns_name’)

    原文作者:一心一意弄算法
    原文地址: https://www.jianshu.com/p/110545409021
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞