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