import pandas as pd
import numpy as np
from sklearn import preprocessing
用LabelEncoder对不同的犯罪类型编号
leCrime = preprocessing.LabelEncoder()
crime = leCrime.fit_transform(train.Category)
为什么要因子化:
对于类型因变量。如果仅仅采用数值编码,那最大的问题就是在这种处理方式中,各种类别的特征都被看成是有序的,这显然是非常不符合实际场景的,所以因子化
方法有两种:
days = pd.get_dummies(train.DayOfWeek)
district = pd.get_dummies(train.PdDistrict)
dummies_Cabin = pd.get_dummies(data_train[‘Cabin’], prefix= ‘Cabin’)
enc = OneHotEncoder()
enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1],[1, 0, 2]])
print “enc.n_values_ is:”,enc.n_values_
print enc.transform([[0, 1, 1]]).toarray()
1、在实际建模前,所有的分类特征,都需要进行因子化
2、pd.get_dummies()是 pandas库提供的快捷方式,但不存储转换信息。OneHotEncoder是比较完备的转换器
数据的标准化(normalization)是将数据按比例缩放,使之落入一个小的特定区间。
对于gradient descent算法来说,learning rate的大小对其收敛速度至关重要。如果feature的scale不同,理论上不同的feature就需要设置不同的learning rate,但是gradient descent只有一个learning rate,这就导致不同feature的收敛效果不同,从而影响总体的收敛效果。所以在求解模型之前归一化不同feature的scale,可以有效提高gradient descent的收敛速度。
因此在机器学习中使用梯度下降法求最优解时,归一化也很有必要,否则模型很难收敛甚至有时不能收敛。
一些分类器需要计算样本之间的距离,如果一个特征的值域范围非常大,那么距离计算就会主要取决于这个特征,有时就会偏离实际情况。
如果feature的scale相差很大,则会出现scale越大的feature,对模型的影响越大。
也需要注意的是,各维分别做归一化会丢失各维方差这一信息,但各维之间的相关系数可以保留
基于树的方法不需要进行特征的归一化。例如随机森林,bagging与boosting等方法。如果是基于参数的模型或者基于距离的模型,因为需要对参数或者距离进行计算,都需要进行归一化。
from sklearn.decomposition import PCA
collist=features.columns.tolist()
scaler = preprocessing.StandardScaler()
scaler.fit(features)
features[collist]=scaler.transform(features)
new_PCA=PCA(n_components=60)
new_PCA.fit(features)
print(new_PCA.explained_variance_ratio_)
这种归一化适合数值比较集中的情况,缺陷就是如果max和min不稳定,很容易使得归一化结果不稳定,使得后续的效果不稳定,实际使用中可以用经验常量来代替max和min。
# 使用scikit-learn函数
from sklearn import preprocessing
min_max_scaler = preprocessing.MinMaxScaler()
feature_scaled = min_max_scaler.fit_transform(feature)
# 使用numpy自定义函数
def min_max_norm(x):
x = np.array(x)
x_norm = (x-np.min(x))/(np.max(x)-np.min(x))
return x_norm
经过处理的数据符合标准正态分布,均值为0,标准差为1。
# 使用scikit-learn函数
from sklearn import preprocessing
standar_scaler = preprocessing.StandardScaler()
feature_scaled = standar_scaler.fit_transform(feature)
# 使用numpy自定义函数
def min_max_norm(x):
x = np.array(x)
x_norm = (x-np.mean(x))/np.std(x)
return x_norm
经常用在数据分化较大的场景,有些数值大,有些很小。通过一些数学函数,将原始值进行映射。该方法包括log、指数、反正切等。需要根据数据分布的情况,决定非线性函数的曲线。
log函数:x = lg(x)/lg(max);反正切函数:x = atan(x)*2/pi
from sklearn.cross_validation import StratifiedShuffleSplit
sss = StratifiedShuffleSplit(labels, train_size=0.5)
for train_index, test_index in sss:
features_train,features_test=features.iloc[train_index],features.iloc[test_index]
labels_train,labels_test=labels[train_index],labels[test_index]
features_test.index=range(len(features_test))
features_train.index=range(len(features_train))
labels_train.index=range(len(labels_train))
labels_test.index=range(len(labels_test))
features.index=range(len(features))
labels.index=range(len(labels))