为训练准备数据

我正在尝试通过创建字符文本的一热编码来准备数据文件,以便稍后可以训练我的分类模型。我有一个训练数据文件,里面包含多行字符,我首先对它们进行整数编码,然后进行一热编码。

例如,数据文件的格式如下:

  1. afafalkjfalkfalfjalfjalfjafajfaflajflajflajfajflajflajfjaljfafj
  2. fgtfafadargggagagagagagavcacacacarewrtgwgjfjqiufqfjfqnmfhbqvcqvfqfqafaf
  3. 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个值的数组(字符串的长度)传递给labelEncoderoneHotEncoder

你真正想要做的是将一个大小为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,其中每一行包含基于所有行中字母的一热编码数组。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注