机器学习处理数据集时,转换成OneHot向量的两种方式
在机器学习处理数据的时候,有时候需要把原始的数据集转换成OneHot向量的形式,模型才能够进一步训练,比如朴素贝叶斯模型等。这里整理两种把原始数据转换为one-hot向量的方式:第一种是使用sklearn.preprocessing中的LabelEncoder和OneHotEncoder进行编码看下面的例子:import numpy as npimport pandas as pdf...
在机器学习处理数据的时候,有时候需要把原始的数据集转换成OneHot向量的形式,模型才能够进一步训练,比如朴素贝叶斯模型等。这里整理两种把原始数据转换为one-hot向量的方式:
第一种是使用sklearn.preprocessing中的LabelEncoder和OneHotEncoder进行编码
看下面的例子:
import numpy as np
import pandas as pd
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
X_train = np.array([[1, 'S'],
[1, 'L'],
[1, 'M'],
[1, 'M'],
[1, 'S'],
[2, 'L'],
[2, 'S'],
[2, 'S'],
[2, 'L'],
[2, 'L'],
[2, 'M'],
[3, 'M'],
[3, 'L'],
[3, 'S'],
[3, 'M'],
[3, 'M']
]
)
Y_train = np.array([-1, 1, 1, -1, -1, 1, 1, -1, 1, -1, 1, 1, 1, 1, -1, 1])
X_test = np.array([2, 'S'])
# 如果想调用sklearn中的贝叶斯模型对X_test进行分类,需要先把训练集和测试集的数据处理一下
data_new = np.vstack((X_train, X_test)) # 合并数据, 采用相同的处理方式
# 下面采用sklearn中的LabelEncoder和OneHotEncoder进行转换
le = LabelEncoder()
data_new[:, 1] = le.fit_transform(data_new[:, 1])
#print(data_new)
enc = OneHotEncoder()
data_new = enc.fit_transform(data_new).toarray()
看一下结果:
[[1. 0. 0. 0. 0. 1.]
[1. 0. 0. 1. 0. 0.]
[1. 0. 0. 0. 1. 0.]
[1. 0. 0. 0. 1. 0.]
[1. 0. 0. 0. 0. 1.]
[0. 1. 0. 1. 0. 0.]
[0. 1. 0. 0. 0. 1.]
[0. 1. 0. 0. 0. 1.]
[0. 1. 0. 1. 0. 0.]
[0. 1. 0. 1. 0. 0.]
[0. 1. 0. 0. 1. 0.]
[0. 0. 1. 0. 1. 0.]
[0. 0. 1. 1. 0. 0.]
[0. 0. 1. 0. 0. 1.]
[0. 0. 1. 0. 1. 0.]
[0. 0. 1. 0. 1. 0.]
[0. 1. 0. 0. 0. 1.]]
[[0. 1. 0. 0. 0. 1.]]
# 提取训练集合测试集
X_train_new = data_new[:X_train.shape[0],:]
X_test_new = data_new[X_train.shape[0]:, :]
# 然后构造高斯模型就可以进行分类了
clf = GaussianNB()
clf.fit(X_train_new, Y_train)
y_predict = clf.predict(X_test_new)
print("{} 被分类为 {}".format(X_test, y_predict)) # -1
print("分类概率:{}".format(clf.predict_proba(X_test_new))) # 分类概率:[[0.74872296 0.25127704]]
这样就完成了一个小的分类的例子, 当然例子可能不高大上,但是这种转换的方式思想比较重要, 要会用LabelEncoder和OneHotEncoder。当然,还有一种简单的方式, 就是pd.DataFrame.get_dummies()
第二种方式, 使用pd.DataFram.get_dummies()进行转换
这种方式比较简单, 还是上面的例子,看看使用pd.DataFrame.get_dummies()
print(data)
#
[['1' 'S']
['1' 'L']
['1' 'M']
['1' 'M']
['1' 'S']
['2' 'L']
['2' 'S']
['2' 'S']
['2' 'L']
['2' 'L']
['2' 'M']
['3' 'M']
['3' 'L']
['3' 'S']
['3' 'M']
['3' 'M']
['2' 'S']]
#
# 下面进行转换
pddata = pd.DataFrame(data)
new_data = pd.get_dummies(pddata)
new_data = new_data.values
[[1. 0. 0. 0. 0. 1.]
[1. 0. 0. 1. 0. 0.]
[1. 0. 0. 0. 1. 0.]
[1. 0. 0. 0. 1. 0.]
[1. 0. 0. 0. 0. 1.]
[0. 1. 0. 1. 0. 0.]
[0. 1. 0. 0. 0. 1.]
[0. 1. 0. 0. 0. 1.]
[0. 1. 0. 1. 0. 0.]
[0. 1. 0. 1. 0. 0.]
[0. 1. 0. 0. 1. 0.]
[0. 0. 1. 0. 1. 0.]
[0. 0. 1. 1. 0. 0.]
[0. 0. 1. 0. 0. 1.]
[0. 0. 1. 0. 1. 0.]
[0. 0. 1. 0. 1. 0.]
[0. 1. 0. 0. 0. 1.]]
[[0. 1. 0. 0. 0. 1.]]
# 后面建立模型的,和上面的一样了, 这种方式转换成one-hot比较快
小总一下:
- 把原数据转换成one-hot表示,有两种方式:
- 一种是借助sklearn.preprocessing中的LabelEncoder和OneHotEncoder函数进行转换
- 一种是先把数据转换成DataFrame结构,然后用pd.getdummies进行转换,再用pd.DataFrame.values获取到值,得到X_train, X_test
在机器学习中,这个还是比较常用的。
参考链接:
pandas.get_dummies 的用法
数据预处理之OneHotEncoder和LabelEncoder编码
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)