1

我正在嘗試通過創建一個字符文本的熱編碼來準備數據文件,我可以稍後使用這些編碼來訓練我的模型進行分類。我有一個由字符行組成的訓練數據文件,我最初正在做它們的整數編碼,然後是一個熱門編碼。培訓數據準備

例如這是數據文件的外觀:

  1. afafalkjfalkfalfjalfjalfjafajfaflajflajflajfajflajflajfjaljfafj
  2. fgtfafadargggagagagagagavcacacacarewrtgwgjfjqiufqfjfqnmfhbqvcqvfqfqafaf
  3. fqiuhqqhfqfqfihhhhqeqrqtqpocckfmafaflkkljlfabadakdpodqpqrqjdmcoqeijfqfjqfjoqfjoqgtggsgsgqr

這是怎麼了接近它:

import pandas as pd 
from sklearn import preprocessing 

categorical_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),然後是後續的一個熱編碼向量。

我的問題是,對於預測,我如何針對每行中的每個字符執行此操作,模型應該從一行(對應於某個標籤)中的字符中學習。有人能給我一些關於如何從那裏出發的見解嗎?

+0

所以你想要每一行都是一個獨立於其他所有編碼的熱門編碼? – Grr

回答

1

鑑於您的例子我結束了,像這樣一個數據幀:

0 
0 0 
1 1 
2 2 

從你的描述聽起來像你想的每一行都有自己的獨立的熱碼。所以,讓我們在第一線的外觀1.

afafalkjfalkfalfjalfjalfjafajfaflajflajflajfajflajflajfjaljfafj 

你得到我上面包括數據幀的原因是該行正變得讀入數據幀,然後傳遞給labelEncoderoneHotEncoder作爲一個單一的價值,而不是63個值的數組(字符串的長度)。

你真正想要做的是通過labelEncoder大小63

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_labels 

array([[ 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 

                0 
0 [[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 

                0 
0 [[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,每行包含一個基於所有行的字母的熱編碼字母數組。

+0

「從你的描述來看,你聽起來像是你想要每一行都有自己獨立的一個熱門編碼」。這種方法是不是正確,只要1條線對應於一個標籤,我將根據準備好的數據(按照我的方法)對測試數據進行分類,以便將其提供給模型進行培訓?或者我以錯誤的方式接近它? – NOOB

+0

one_hot_encoded = cat_dat.apply(lambda x:oneHotEncoder。transform(labelEncoder.transform(x [0])。reshape(-1,1))。toarray()],axis = 1)給出一個ValueError:('X的形狀與擬合時不同,預期26,得到1。 ',發生在索引0')。另外,這一行還有一個額外的方括號。 – NOOB

+0

如果沒有更多關於你在做什麼的背景,我將無法說出。一般來說,如果所有的線都被用作訓練數據,那麼它們都應該以相同的方式進行轉換,而不是對每個觀察進行唯一的轉換。 – Grr