几个数据预处理的基础技术:
均值移除(mean removal)
通常我们会把每个特征的平均值移除,保证特征均值为0,这样能够消除特征彼此间的偏差。
范围缩放(scaling)
当数据点中每个特征的数值范围很大时,可以考虑将特征的数值范围缩放到某一区间。
归一化(normalization)
归一化用于需要对特征向量的值进行调整时,保证每个特征向量的值都缩放到相同数值范围。可以看作是用占比表示特征。
二值化(binarization)
二值化用于将数值特征向量转换为布尔类型向量。一般会设定一个阈值。
独热编码(one-hot encoding)
独热编码把特征向量的每个特征与特征的非重复总数相对应,通过` o n e − h o t − k one-hot-k one−hot−k的形式对每个值进行编码,有点抽象,可以看下面的例子理解。
在Python中使用sklearn中preprocessing包实现这些基础操作。
import numpy as np
from sklearn import preprocessing
data=np.array([[3,-1.5,2,-5.4],[0,4,-0.3,2.1],[1,3.3,-1.9,-4.3]])
# 均值移除,axis=0进行列操作,特征均值基本为0,标准差为1
data_standardized=preprocessing.scale(data,axis=0)
print(data_standardized)
print("\nMean =", data_standardized.mean(axis=0))
print ("Std deviation =", data_standardized.std(axis=0))
# out
[[ 1.33630621 -1.40451644 1.29110641 -0.86687558]
[-1.06904497 0.84543708 -0.14577008 1.40111286]
[-0.26726124 0.55907936 -1.14533633 -0.53423728]]
Mean = [ 5.55111512e-17 -1.11022302e-16 -7.40148683e-17 -7.40148683e-17]
Std deviation = [1. 1. 1. 1.]
#范围缩放
data_scaler=preprocessing.MinMaxScaler(feature_range=(0,1))
data_scaled=data_scaler.fit_transform(data)
print(data_scaled)
#out
[[1. 0. 1. 0. ]
[0. 1. 0.41025641 1. ]
[0.33333333 0.87272727 0. 0.14666667]]
#归一化
data_normalized=preprocessing.normalize(data,norm="l1")
print(data_normalized)
#out
[[ 0.25210084 -0.12605042 0.16806723 -0.45378151]
[ 0. 0.625 -0.046875 0.328125 ]
[ 0.0952381 0.31428571 -0.18095238 -0.40952381]]
#二值化
data_binarized=preprocessing.Binarizer(threshold=2).transform(data)
print(data_binarized)
#out
[[1. 0. 0. 0.]
[0. 1. 0. 1.]
[0. 1. 0. 0.]]
#独热编码
encoder=preprocessing.OneHotEncoder()
encoder.fit([[0,2,1,12],[1,3,5,3],[2,3,2,12],[1,2,4,3]])
encoder_vector=encoder.transform([[2,3,5,3]]).toarray()
print(encoder_vector)
#out
#例如,第三列特征有1,5,2,4,独热编码向量的长度就是4,1是1000,2是0100,4是0010,5是0001,其他列也这样编码
[[0. 0. 1. 0. 1. 0. 0. 0. 1. 1. 0.]]
from sklearn import preprocessing
label_encoder=preprocessing.LabelEncoder()
input_classes=['beijing','shanghai','guangzhou','shenzhen']
label_encoder.fit(input_classes)
#编码
labels=['beijing','shenzhen']
encoded_labels=label_encoder.transform(labels)
print(list(encoded_labels))
#out 默认会对标记排序
[0, 3]
#解码
encoded_labels=[2,1,0,3,1]
decoded_labels=label_encoder.inverse_transform(encoded_labels)
print(list(decoded_labels))
#out
['shanghai', 'guangzhou', 'beijing', 'shenzhen', 'guangzhou']
在评价回归器的拟合效果中,常用的指标如下:
scikit-learn中提供了相应的模块,使用也非常方便。
#每行依次表示上述指标
import sklearn.metrics as sm
print(round(sm.mean_absolute_error(y_test,y_test_pred),2))
print(round(sm.mean_squared_error(y_test,y_test_pred),2))
print(round(sm.median_absolute_error(y_test,y_test_pred),2))
print(round(sm.explained_variance_score(y_test,y_test_pred),2))
print(round(sm.r2_score(y_test,y_test_pred),2))
#X_train.shape,y_train.shape为(40, 1),(40,)
from sklearn import linear_model
import matplotlib.pyplot as plt
linear_regressor=linear_model.LinearRegression()
linear_regressor.fit(X_train,y_train)
y_train_pred=linear_regressor.predict(X_train)
plt.figure()
plt.scatter(X_train,y_train,color='green')
plt.plot(X_train,y_train_pred,color='black',linewidth=4)
plt.show()
#alpha参数控制回归器的复杂程度,对异常值降低敏感度就需要设置较大的值
ridge_regressor=linear_model.Ridge(alpha=0.0001,fit_intercept=True,max_iter=10000)
ridge_regressor.fit(X_train,y_train)
y_test_pred_ridge=ridge_regressor.predict(X_test)