我是機器學習的新手,我嘗試使用“rain austrialia”資料集訓練模型。目前我處于預處理步驟,在使用 KNNImputer 填充所有 NaN 值之后,我嘗試使用以下自定義轉換器類洗掉例外值。
class OutliersRemover(BaseEstimator, TransformerMixin):
def __init__(self, cols_indexes):
self.cols_indexes = cols_indexes
def fit(self, X, y=None):
return self
def transform(self, X, y=None):
outliers_indexes = set()
threshold = 3
X = X.to_numpy()
for col_index in self.cols_indexes:
mean = np.mean(X[:, col_index])
std = np.std(X[:, col_index])
for line_index, item in enumerate(X[:, col_index]):
z_score = (item - mean) / std
if np.abs(z_score) > threshold:
outliers_indexes.add(line_index)
print("Removing: {} outliers".format(len(outliers_indexes)))
return np.delete(X, list(outliers_indexes), 0)
outliers_remover = OutliersRemover(np.arange(24))
X_train_transformed = outliers_remover.fit_transform(X_train)
它似乎可以正確洗掉,但問題是如果我運行下面的代碼來檢查是否洗掉了所有例外值,它會洗掉另一組例外值。如果我運行 10 次相同的代碼,它會洗掉不同的例外值集,直到 0。
for _ in range(10):
X_train_transformed = outliers_remover.fit_transform(X_train_transformed)
Removing: 1389 outliers
Removing: 319 outliers
Removing: 528 outliers
...
Removing: 0 outliers
我想知道這是資料集的正常行為還是我做錯了什么。
uj5u.com熱心網友回復:
在每次迭代中,您從 中洗掉例外值X_train_transformed并將回傳的值分配回X_train_transformed. 您洗掉例外值的標準是始終洗掉某些值(見下文)。
至于是否是資料集的正常行為,Yes!。任何數值資料集都將具有平均值和標準,并且很可能具有(value - mean) / std大于 3 的值。如果您洗掉這些值并計算新的平均值和標準,您現在(value - mean) / std將獲得大于 3的新值因為你的平均值和標準會改變。
我建議只洗掉一次例外值。也許玩弄threshold以確定您要洗掉多少。此外,請考慮閱讀正態分布、它們的均值和標準差的作業原理。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/427794.html
