下列程式中, 為什麼資料傳入Label Encoder前需要把df[].values轉成list呢?
2019/03/30 下午 02:46
機器學習共學討論版
Li-xuan Chen
觀看數:1
回答數:4
收藏數:1
ml100
python
ml100-d29
回答列表
-
2019/04/01 下午 08:43陳明佑 (Ming You Chen)贊同數:0不贊同數:0留言數:0
-
2019/04/02 下午 02:38Li-xuan Chen贊同數:0不贊同數:0留言數:0
-
2019/04/03 上午 11:05陳明佑 (Ming You Chen)贊同數:不贊同數:留言數:
因為同學問得比較詳細, 所以剛剛不是用理解,
而是深入追蹤這一段code問題在哪
仔細逐行追蹤後, 發現問題似乎是在於上一行 -> df[c] = df[c].fillna(-1)
因為 LabelEncoder 要編碼前,
要先找出內容總共有幾種 ( 呼叫 np.unique() 函數 ), 並且排序
但是比較時, 原本欄位中都是字串 'str',
與補缺填入的 -1 (是整數 'int') 無法比大小
(也就是說 字串跟字串 / 數值與數值 個別可以比大小, 但兩者之間不行)
知道這個問題後, 我試著將D17程式改成下面這樣, 就能順利執行了
如果是文字類別, 改填補 'None' 這個字串,
不僅不用 list(), 連 .values 也可以拿掉了, 應該比較容易理解吧?
*但仔細想想, 就算放入整數, 用原本的方式雖然粗暴, 但也行得通呢...
Python真是有趣的語言...
LEncoder = LabelEncoder()
MMEncoder = MinMaxScaler()
for c in df.columns:
if df[c].dtype == 'object':
df[c] = df[c].fillna('None')
df[c] = LEncoder.fit_transform(df[c])
else:
df[c] = df[c].fillna(-1)
df[c] = MMEncoder.fit_transform(df[c].values.reshape(-1, 1))
df.head() -
2019/04/03 下午 00:35張維元 (WeiYuan)贊同數:1不贊同數:0留言數:0