我正在尝试通过创建字符文本的一热编码来准备数据文件,以便稍后可以训练我的分类模型。我有一个训练数据文件,里面包含多行字符,我首先对它们进行整数编码,然后进行一热编码。
例如,数据文件的格式如下:
- afafalkjfalkfalfjalfjalfjafajfaflajflajflajfajflajflajfjaljfafj
- fgtfafadargggagagagagagavcacacacarewrtgwgjfjqiufqfjfqnmfhbqvcqvfqfqafaf
- fqiuhqqhfqfqfihhhhqeqrqtqpocckfmafaflkkljlfabadakdpodqpqrqjdmcoqeijfqfjqfjoqfjoqgtggsgsgqr
我的方法如下:
import pandas as pdfrom sklearn import preprocessingcategorical_data = pd.read_csv('abc.txt', sep="\n", header=None)labelEncoder = preprocessing.LabelEncoder()X = categorical_data.apply(labelEncoder.fit_transform)print("Afer label encoder")print(X.head())oneHotEncoder = preprocessing.OneHotEncoder()oneHotEncoder.fit(X)onehotlabels = oneHotEncoder.transform(X).toarray()print("Shape after one hot encoding:", onehotlabels.shape)print(onehotlabels)
我得到每行的整数编码(在我的例子中是0,1,2),然后是后续的一热编码向量。
我的问题是,如何对每行中的每个字符进行编码,因为在预测时,模型应该从一行中的字符(对应于某个标签)中学习。有人能给我一些关于如何继续进行的见解吗?
回答:
根据你的例子,我得到的DataFrame如下:
00 01 12 2
从你的描述来看,你似乎希望每行有自己独立的一热编码。所以我们先来看第一行。
afafalkjfalkfalfjalfjalfjafajfaflajflajflajfajflajflajfjaljfafj
你得到上面我展示的DataFrame的原因是,这行被读入DataFrame,然后作为单个值而不是一个包含63个值的数组(字符串的长度)传递给labelEncoder
和oneHotEncoder
。
你真正想要做的是将一个大小为63的数组传递给labelEncoder
。
data = np.array([let for let in categorical_data[0][0]])X = labelEncoder.fit_transform(data)oneHotEncoder.fit(X.reshape(-1,1))row_1_labels = oneHotEncoder.transform(X.reshape(-1,1)).toarray()row_1_labelsarray([[ 1., 0., 0., 0., 0.], [ 0., 1., 0., 0., 0.], [ 1., 0., 0., 0., 0.], [ 0., 1., 0., 0., 0.], [ 1., 0., 0., 0., 0.], [ 0., 0., 0., 0., 1.], [ 0., 0., 0., 1., 0.], [ 0., 0., 1., 0., 0.], [ 0., 1., 0., 0., 0.], [ 1., 0., 0., 0., 0.], [ 0., 0., 0., 0., 1.], [ 0., 0., 0., 1., 0.], [ 0., 1., 0., 0., 0.], [ 1., 0., 0., 0., 0.], [ 0., 0., 0., 0., 1.], [ 0., 1., 0., 0., 0.], [ 0., 0., 1., 0., 0.], [ 1., 0., 0., 0., 0.], [ 0., 0., 0., 0., 1.], [ 0., 1., 0., 0., 0.], [ 0., 0., 1., 0., 0.], [ 1., 0., 0., 0., 0.], [ 0., 0., 0., 0., 1.], [ 0., 1., 0., 0., 0.], [ 0., 0., 1., 0., 0.], [ 1., 0., 0., 0., 0.], [ 0., 1., 0., 0., 0.], [ 1., 0., 0., 0., 0.], [ 0., 0., 1., 0., 0.], [ 0., 1., 0., 0., 0.], [ 1., 0., 0., 0., 0.], [ 0., 1., 0., 0., 0.], [ 0., 0., 0., 0., 1.], [ 1., 0., 0., 0., 0.], [ 0., 0., 1., 0., 0.], [ 0., 1., 0., 0., 0.], [ 0., 0., 0., 0., 1.], [ 1., 0., 0., 0., 0.], [ 0., 0., 1., 0., 0.], [ 0., 1., 0., 0., 0.], [ 0., 0., 0., 0., 1.], [ 1., 0., 0., 0., 0.], [ 0., 0., 1., 0., 0.], [ 0., 1., 0., 0., 0.], [ 1., 0., 0., 0., 0.], [ 0., 0., 1., 0., 0.], [ 0., 1., 0., 0., 0.], [ 0., 0., 0., 0., 1.], [ 1., 0., 0., 0., 0.], [ 0., 0., 1., 0., 0.], [ 0., 1., 0., 0., 0.], [ 0., 0., 0., 0., 1.], [ 1., 0., 0., 0., 0.], [ 0., 0., 1., 0., 0.], [ 0., 1., 0., 0., 0.], [ 0., 0., 1., 0., 0.], [ 1., 0., 0., 0., 0.], [ 0., 0., 0., 0., 1.], [ 0., 0., 1., 0., 0.], [ 0., 1., 0., 0., 0.], [ 1., 0., 0., 0., 0.], [ 0., 1., 0., 0., 0.], [ 0., 0., 1., 0., 0.]])
你可以对每一行重复这个过程,以获得独立的一热编码。如下所示:
one_hot_encodings = categorical_data.apply(lambda x: [oneHotEncoder.fit_transform(labelEncoder.fit_transform(np.array([let for let in x[0]])).reshape(-1,1)).toarray()], axis=1)one_hot_encodings 00 [[1.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, 1.0, 0.0, 0.0, 0.0,...2 [[0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0,...
如果你希望行基于所有行中找到的值进行一热编码,你可以首先将labelEncoder
拟合到所有独特的字母上,然后对每一行进行转换。如下所示:
unique_letters = np.unique(np.array([let for row in categorical_data.values for let in row[0]]))labelEncoder.fit(unique_letters)unique_nums = labelEncoder.transform(unique_letters)oneHotEncoder.fit(unique_nums.reshape(-1,1))cat_dat = categorical_data.apply(lambda x: [np.array([let for let in x[0]])], axis=1)one_hot_encoded = cat_dat.apply(lambda x: [oneHotEncoder.transform(labelEncoder.transform(x[0]).reshape(-1,1)).toarray()], axis=1)one_hot_encoded 00 [[1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,...1 [[0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0,...2 [[0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0,...
这将返回一个DataFrame,其中每一行包含基于所有行中字母的一热编码数组。