iT邦幫忙

0

特徵進行標準化後數值全部變成0

https://ithelp.ithome.com.tw/upload/images/20210328/201316294QXkbpRbfi.jpg

如圖,我想進行標準化,但進行完之後卻全部都變成0,想請問這是為什麼?
還是機器學習新手,所以某些問題還不是很了解請見諒。

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

1
微甜的酸
iT邦新手 2 級 ‧ 2021-03-28 18:46:07

咦?

因為你只有輸入一個四維的資料,你要做的應該是下方這個圖的效果。

看更多先前的回應...收起先前的回應...
xuanxuan iT邦新手 5 級 ‧ 2021-03-28 19:43:05 檢舉

您好,因為我想讓使用者輸入一組特徵,然後用我之前儲存的模型進行預測,所以輸入的特徵我讓他先標準化,但不知為什麼跑出來會都是0
1.請問如果只有輸入一筆資料的話就無法進行標準化嗎?
2.請問您圖一的數值是經過標準化後跑出來的數值嗎? 想請問是如何做出來的?
3.請問為什麼要reshape(-1,1)?

更新了~

因為你只有輸入一個四維的資料

  1. 所以你不能標準化。(因此Question1是"圈圈")
  2. 第二個Question也是"圈圈"喔~但沒B用,因為我以為你是要對21.8,36,44,25這四筆資料標準化,解果你是要對這筆四維資料進行預測(其實你看第二張圖就可以發現)
  3. 同上,美麗的誤會~

解決方法:預測不用標準化喔!!!

xuanxuan iT邦新手 5 級 ‧ 2021-03-28 20:08:48 檢舉

真的嗎,因為我之前都只有用原始的資料拆分成訓練跟測試,然後都有先預處理標準化,之後再拿測試資料去預測看看,所以我以為另外輸入一筆新的資料進去預測的話,也要先進行預處理標準化
1.所以我只要讓使用者輸入完資料後,拿那筆資料直接利用predict進行預測這樣就可以了嗎?

沒記錯的話,是的。待會給你正式的答案(要翻一下一年前的code)

xuanxuan iT邦新手 5 級 ‧ 2021-03-28 20:17:23 檢舉

好的,那我先不進行標準化試試看,那就麻煩您了

恩~看來是我記錯了,要用舊的標準化方法對新的資料作標準化。詳細參考這篇文章。所以說你要用舊的(訓練時)scaler進行標準化再丟到模型裡進行預測。

xuanxuan iT邦新手 5 級 ‧ 2021-03-28 21:02:06 檢舉

看完那篇參考文章後,如果需要對新資料進行標準化的話,就要把新資料+舊資料一起進行標準化之後,再把新資料從中拉出來使用原本儲存的模型進行預測這樣嗎?

用之前標準化訓練資料的scaler來標準化預測資料。

xuanxuan iT邦新手 5 級 ‧ 2021-03-28 21:16:21 檢舉

可是我這樣只有一筆新輸入的資料,這樣的話不是就無法進行標準化嗎?

等我寫個簡單的範例

from sklearn.datasets import load_breast_cancer
from sklearn import preprocessing
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split

cancer = load_breast_cancer()
X = cancer.data 
y = cancer.target

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

#為測試集建立標準化函數
scaler = preprocessing.StandardScaler().fit(X_train)

X_train = scaler.transform(X_train)

model = SVC(kernel='rbf')
model.fit(X_train, y_train)

#使用剛的標準化函數
X_test = scaler.transform(X_test)
y_pred = model.predict(X_test)
xuanxuan iT邦新手 5 級 ‧ 2021-03-28 21:47:50 檢舉

那如果我使用"model.save"儲存模型之後,在load模型出來使用,這樣我之前標準化的函數還可以使用嗎?

可以啊,只要在同個程式裡,變數scale都可以用。

xuanxuan iT邦新手 5 級 ‧ 2021-03-28 21:56:25 檢舉

那如果是在不同程式中要使用之前儲存的模型呢?

就用與標準化訓練集用相同的標準化方式。你要想成他們來自相同的母集,所以具有相似的分布及特徵。因此在使用相同的方法後,會對應到相同的值域。

1
I code so I am
iT邦高手 1 級 ‧ 2021-03-29 08:46:55

data 要改寫一下格式,因為原寫法代表4個特徵,只有一筆資料,因此,轉換後均為0。

from sklearn.preprocessing import MinMaxScaler
data = [[21.8], [44], [36], [25]]
scaler = MinMaxScaler()
print(scaler.fit_transform(data))
xuanxuan iT邦新手 5 級 ‧ 2021-03-29 15:03:59 檢舉

好的,我再試試看您提供的這項方法,謝謝

我要發表回答

立即登入回答