快速入门Python机器学习(35)(上)

简介: 快速入门Python机器学习(35)(上)

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()

image.png


用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()

image.png

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()

image.png


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_[ij]是第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()

image.png

每一个箱子中的斜率加大了,但是斜率是一样的。


#使用新的叠堆方式处理数据
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

目录
相关文章
|
3月前
|
机器学习/深度学习 数据采集 数据可视化
Python数据科学实战:从Pandas到机器学习
Python数据科学实战:从Pandas到机器学习
|
3月前
|
机器学习/深度学习 人工智能 算法
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
手写数字识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Flask框架,开发网页端操作平台,实现用户上传一张图片识别其名称。
179 0
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
|
3月前
|
机器学习/深度学习 数据采集 人工智能
探索机器学习:从理论到Python代码实践
【10月更文挑战第36天】本文将深入浅出地介绍机器学习的基本概念、主要算法及其在Python中的实现。我们将通过实际案例,展示如何使用scikit-learn库进行数据预处理、模型选择和参数调优。无论你是初学者还是有一定基础的开发者,都能从中获得启发和实践指导。
88 2
|
3月前
|
机器学习/深度学习 数据可视化 数据处理
掌握Python数据科学基础——从数据处理到机器学习
掌握Python数据科学基础——从数据处理到机器学习
69 0
|
3月前
|
机器学习/深度学习 数据采集 人工智能
机器学习入门:Python与scikit-learn实战
机器学习入门:Python与scikit-learn实战
107 0
|
3月前
|
机器学习/深度学习 数据采集 数据挖掘
Python在数据科学中的应用:从数据处理到模型训练
Python在数据科学中的应用:从数据处理到模型训练
|
3月前
|
机器学习/深度学习 算法 数据挖掘
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
196 6
|
1月前
|
机器学习/深度学习 人工智能 算法
机器学习算法的优化与改进:提升模型性能的策略与方法
机器学习算法的优化与改进:提升模型性能的策略与方法
276 13
机器学习算法的优化与改进:提升模型性能的策略与方法
|
1天前
|
机器学习/深度学习 人工智能 自然语言处理
解锁机器学习的新维度:元学习的算法与应用探秘
元学习作为一个重要的研究领域,正逐渐在多个应用领域展现其潜力。通过理解和应用元学习的基本算法,研究者可以更好地解决在样本不足或任务快速变化的情况下的学习问题。随着研究的深入,元学习有望在人工智能的未来发展中发挥更大的作用。
|
1月前
|
机器学习/深度学习 算法 网络安全
CCS 2024:如何严格衡量机器学习算法的隐私泄露? ETH有了新发现
在2024年CCS会议上,苏黎世联邦理工学院的研究人员提出,当前对机器学习隐私保护措施的评估可能存在严重误导。研究通过LiRA攻击评估了五种经验性隐私保护措施(HAMP、RelaxLoss、SELENA、DFKD和SSL),发现现有方法忽视最脆弱数据点、使用较弱攻击且未与实际差分隐私基线比较。结果表明这些措施在更强攻击下表现不佳,而强大的差分隐私基线则提供了更好的隐私-效用权衡。
53 14

推荐镜像

更多