scikit_learn(sklearn)数据预处理

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

scikit_learn(sklearn)数据预处理_第1张图片
image.png

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

数据预处理实战

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

Country Age Salary Purchased
France 44 72000 No
Spain 27 48000 Yes
Germany 30 54000 No
Spain 38 61000 No
Germany 40 Yes
France 35 58000 Yes
Spain 52000 No
France 48 79000 Yes
Germany 50 83000 No
France 37 67000 Yes

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

首先,我们需要导入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')

你可能感兴趣的:(scikit_learn(sklearn)数据预处理)