14.2数据表达与特征工程
14.2.1数据表达
哑变量:利用类似pd.get_dummies得到的0,1数据。
import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.neural_network import MLPRegressor from sklearn.neighbors import KNeighborsRegressor from sklearn.preprocessing import OneHotEncoder#独热编码,同pd.get_dummies,但仅能用于整型变量 def base_for_dummies(): colour = pd.DataFrame({'数据特征':[1,2,3,4,5,6,7],'颜色类型':['赤','橙','黄','绿','青','蓝','紫']}) print(colour)
输出
数据特征 |
颜色类型 |
|
0 |
1 |
赤 |
1 |
2 |
橙 |
2 |
3 |
黄 |
3 |
4 |
绿 |
4 |
5 |
青 |
5 |
6 |
蓝 |
6 |
7 |
紫 |
colour_dum = pd.get_dummies(colour) print(colour_dum)
输出
数据特征 |
颜色类型_橙 |
颜色类型_紫 |
颜色类型_绿 |
颜色类型_蓝 |
颜色类型_赤 |
颜色类型_青 |
颜色类型_黄 |
|
0 |
1 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
2 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
2 |
3 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
3 |
4 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
4 |
5 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
5 |
6 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
6 |
7 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
colour['数据特征'] = colour['数据特征'].astype(str) colour_dum = pd.get_dummies(colour,columns=['数据特征']) print(colour_dum)
颜色类型 |
数据特征_1 |
数据特征_2 |
数据特征_3 |
数据特征_4 |
数据特征_5 |
数据特征_6 |
数据特征_7 |
|
0 |
赤 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
橙 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
2 |
黄 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
3 |
绿 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
4 |
青 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
5 |
蓝 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
6 |
紫 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
14.2.2 OneHotEncoder类
class sklearn.preprocessing.OneHotEncoder(*, categories='auto', drop=None, sparse=True, dtype=, handle_unknown='error')
将分类特征编码为独热的数字数组。
这个转换器的输入应该是一个类似整数或字符串的数组,表示由分类(离散)特征获取的值。这些特征使用one-hot(也称为'one-of-K'或'dummy')编码方案进行编码。这将为每个类别创建一个二进制列,并返回稀疏矩阵或密集数组(取决于稀疏参数)
默认情况下,编码器根据每个特征中的唯一值导出类别。或者,也可以手动指定类别。
这种编码是为许多scikit学习估计器提供分类数据所必需的,特别是线性模型和具有标准核的支持向量机。
注意:y标签的独热编码应该改用LabelBinarizer。
参数
参数 |
类型 |
解释 |
categories_ |
list of arrays |
拟合过程中确定的每个特征的类别(按X中特征的顺序排列,并与变换的输出相对应)。这包括drop中指定的类别(如果有)。 |
drop_idx_ |
array of shape (n_features,) |
•drop_idx_[i] :是要为每个功能删除的类别的categories_[i]中的索引。 •drop_idx_[i]=None:如果不从索引为i的功能中删除任何类别,例如,当drop='if_binary'且功能不是二进制时。 •drop_idx_= None:如果将保留所有变换的特征,请删除。 |
方法
fit(X[, y]) |
将独热编码器安装到X。 |
fit_transform(X[, y]) |
将独热编码器安装到X,然后变换X。 |
get_feature_names([input_features]) |
返回输出功能的功能名称。 |
get_params([deep]) |
获取此估计器的参数。 |
inverse_transform(X) |
将数据转换回原始表示形式。 |
set_params(**params) |
设置此估计器的参数。 |
transform(X) |
使用独热编码转换X。 |
14.2.3装箱处理
#生成随机数列 rnd = np.random.RandomState(56) x = rnd.uniform(-5,5,size=50) #向数据添加噪音 y_no_noise = (np.cos(6*x)+x) X = x.reshape(-1,1) y = (y_no_noise + rnd.normal(size=len(x)))/2 plt.plot(X,y,'o',c='g') plt.show()
用MLPRegressor与KNeighborsRegressor进行拟合
line = np.linspace(-5,5,1000,endpoint=False).reshape(-1,1) mlpr = MLPRegressor().fit(X,y) knr = KNeighborsRegressor().fit(X,y) plt.plot(line,mlpr.predict(line),label='MLP') plt.plot(line,knr.predict(line),label='KNN') plt.plot(X,y,'o',c='g') plt.legend(loc='best') plt.show()
MLPRegressor与KNeighborsRegressor拟合线不一致
digitize离散化处理,又称装箱处理
#设置11个箱子 bins = np.linspace(-5,5,11) #将数据装箱 target_bin = np.digitize(X, bins=bins) print("装箱数据范围:\n{}".format(bins)) print("前10个数据点的特征值:\n{}".format(X[:10])) print("前10个数据点所在的箱子:\n{}".format(target_bin[:10]))
输出
分为 [-5,-4],[-4,-3],[-3,-2],[-2,-1],[-1,0],[0,1],[1,2],[2,3],[3,4],[4,5] 10个箱子 装箱数据范围: [-5. -4. -3. -2. -1. 0. 1. 2. 3. 4. 5.] 前10个数据点的特征值: [[ 4.84191851] [-1.66587734] [ 1.73701625] [-3.03609583] [-1.45553535] [ 3.13365953] [-2.52150446] [-0.41388675] [ 3.77301421] [-1.08341539]] 前10个数据点所在的箱子: [[10] [ 4] [ 7] [ 2] [ 4] [ 9] [ 3] [ 5] [ 9] [ 4]]
onehot = OneHotEncoder(sparse = False) onehot.fit(target_bin) #将独热编码转为数据 X_in_bin = onehot.transform(target_bin) print("装箱后的数据形态:\n{}".format(X_in_bin.shape)) print("装箱后的前10个数据点:\n{}".format(X_in_bin[:10]))
输出
装箱后的数据形态: (50, 10) 装箱后的前10个数据点: [[0. 0. 0. 0. 0. 0. 0. 0. 0. 1.] [0. 0. 0. 1. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 1. 0. 0. 0.] [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 1. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0. 1. 0.] [0. 0. 1. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 1. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0. 1. 0.] [0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]]
仍旧50个数据,10个形态(因为装进了10个箱子)
#使用独热编码进行数据表达 onehot_line = onehot.transform(np.digitize(line,bins=bins)) onehot_mlpr = MLPRegressor().fit(X_in_bin,y) onehot_knr = KNeighborsRegressor().fit(X_in_bin,y) plt.plot(line,onehot_mlpr.predict(onehot_line),label='New MLP') plt.plot(line,onehot_knr.predict(onehot_line),label='New KNN') plt.plot(X,y,'o',c='g') plt.legend(loc='best') plt.show()
MLP与KNN拟合曲线保持一致,但是在每个箱子里面均为横直线,即斜率为0
对于基于决策树算法(随机森林,梯度上升决策树,决策树)没有效果
14.2.4 PolynomialFeatures类
class sklearn.preprocessing.PolynomialFeatures(degree=2, *, interaction_only=False, include_bias=True, order='C')
属性
属性 |
类型 |
解释 |
powers_ |
ndarray of shape (n_output_features, n_input_features) |
powers_[i,j]是第i个输出中第j个输入的指数。 |
n_input_features_ |
Int |
输入功能的总数。 |
n_output_features_ |
Int |
多项式输出特征的总数。输出特征的数量是通过迭代输入特征的所有适当大小的组合来计算的。 |
方法
fit(X[, y]) |
计算输出特征的数量。 |
fit_transform(X[, y]) |
适应数据,然后转换它。 |
get_feature_names([input_features]) |
返回输出功能的功能名称。 |
get_params([deep]) |
获取此估计器的参数。 |
set_params(**params) |
设置此估计器的参数。 |
transform(X) |
将数据转换为多项式特征。 |
14.1.5 数据升维
统计建模方式:
- 交互性特征(Interaction Feature);
- 多项式特征(Polynomial Feature)。
1) 交互性特征(Interaction Feature)
array_1 = [0,1,2,3,4] array_2 = [5,6,7,8,9] array3 = np.hstack((array_1,array_2)) print("将数组2添加到数据1后面去得到:\n{}".format(array3))
输出
将数组2添加到数据1后面去得到: [0 1 2 3 4 5 6 7 8 9]
#将原始数据和装箱数据进行堆叠 X_stack = np.hstack([X,X_in_bin]) print("X.shape:\n",X.shape) print("X_in_bin.shape:\n",X_in_bin.shape) print("X_stack.shape:\n",X_stack.shape
输出
X.shape: (50, 1) X_in_bin.shape: (50, 10) X_stack.shape: (50, 11)
#将数据进行堆叠 line_stack = np.hstack([line,onehot_line]) mlpr_interact = MLPRegressor().fit(X_stack,y) plt.plot(line,mlpr_interact.predict(line_stack),label='MLP for interaction') plt.ylim(-4,4) for vline in bins: plt.plot([vline,vline],[-5,5],":",c='k') plt.legend(loc='lower right') plt.plot(X,y,"o",c='g') plt.show()
每一个箱子中的斜率加大了,但是斜率是一样的。
#使用新的叠堆方式处理数据 X_multi = np.hstack([X_in_bin,X*X_in_bin]) print("X_multi.shape:\n",X_multi.shape) print("X_multi[0]:\n",X_multi[0])
输出
X_multi.shape: (50, 20) X_multi[0]: [0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 4.84191851] 前10个数据点的特征值: [[ 4.84191851] [-1.66587734] [ 1.73701625] [-3.03609583] [-1.45553535] [ 3.13365953] [-2.52150446] [-0.41388675] [ 3.77301421] [-1.08341539]]
保持X_in_bin中的1以及元数据:4.84191851