簡體   English   中英

Python:如何使用線性回歸預測 NAN 值?

[英]Python:How to predict NAN values using linear regression?

我的數據集中有一些 Nan 值,我想用預測值替換它們。

這是我的數據集:

    code    v0      v1   v2      v3

0   zd56    NaN     25  189.3   0.07
1   wd_89   12.9    22  193.6   0.12
2   wd_891  13.0    50  193.8   0.43
3   nsw_20  14.5    26  180.2   0.16
4   lstm5   9.1     13  170.9   0.13
5   mus_80  10.0    20  186.8   0.11
6   gs      10.0    22  187.0   0.05
7   df00    NaN     12  189.9   0.10

我想通過根據列 v1、v2 和 v3 預測線性回歸來替換列 v0 中的這兩個 Nans。
如果沒有缺失值,我會這樣做:

X = df[['v1', 'v2', 'v3']]
y = df['v0'].values

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.8, random_state=0)

regressor = LinearRegression()  
regressor.fit(X_train, y_train)

y_pred = regressor.predict(X_test)

df1 = pd.DataFrame({'Actual': y_test, 'Predicted': y_pred})
df1

但我知道我們不能將缺失值傳遞給算法,即使經過一些研究,我也找不到我的問題的解決方案。

train_test_split 方法隨機拆分數據集。 我想知道是否有一種方法可以“手動”拆分:將所有缺失值放入 y_test。

我非常感謝所有可能有用的答案。 謝謝!

Imputer 可能是您正在尋找的那個。

sklearn imputer 文檔中的相關片段如下所示。
鏈接: https://scikit-learn.org/stable/modules/generated/sklearn.impute.SimpleImputer.html

>>> import numpy as np
>>> from sklearn.impute import SimpleImputer
>>> imp_mean = SimpleImputer(missing_values=np.nan, strategy='mean')
>>> imp_mean.fit([[7, 2, 3], [4, np.nan, 6], [10, 5, 9]])
SimpleImputer()
>>> X = [[np.nan, 2, 3], [4, np.nan, 6], [10, np.nan, 9]]
>>> print(imp_mean.transform(X))
[[ 7.   2.   3. ]
 [ 4.   3.5  6. ]
 [10.   3.5  9. ]]

您只需首先將 DataFrame 拆分為一個用於訓練 model 的部分,另一個用於預測缺失值的部分。 您可以通過以下方式做到這一點:

df_to_train_on = df[~pd.isnull(df[column_name_with_missing_values])]
df_with_missing_values = df[pd.isnull(df[column_name_with_missing_values])]

然后將每個單獨拆分為 X 和 y。 是否要在 df_to_train_on 上使用df_to_train_on進行額外拆分取決於您是否要在將 model 應用於df_with_missing_values之前對其進行評估。 如果不這樣做,只需將df_with_missing_values中的 X 視為X_test

直接將所有缺失值分別放到 dataframe 中,然后使用train_test_split(...) ,可以使用 boolean 索引。

nan_rows = df[df['v0'].isna()]

df.dropna(inplace=True)

X = df[['v1', 'v2', 'v3']]
y = df['v0']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.8, random_state=0)

x_test = pd.concat([x_test, nan_rows.drop(['v0'], axis=1)])
y_test = pd.concat([y_test, nan_rows['v0']])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM