【问题标题】:Python:How to predict NAN values using linear regression?Python:如何使用线性回归预测 NAN 值?
【发布时间】:2020-07-24 12:12:25
【问题描述】:

我的数据集中有一些 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 中的这两个 Nan。
如果没有缺失值,我会这样做:

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。

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

【问题讨论】:

    标签: python pandas linear-regression prediction


    【解决方案1】:

    Imputer 可能就是您要找的那个。

    sklearn imputer 文档中的相关 sn-p 如下所示。
    链接: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. ]]
    

    【讨论】:

      【解决方案2】:

      您只需首先将 DataFrame 拆分为一个用于训练模型的数据帧和另一个用于预测缺失值的数据帧。你可以这样做:

      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 上使用 train_test_split 进行额外拆分取决于您是否要在将模型应用到 df_with_missing_values 之前对其进行评估。如果不这样做,只需将来自 df_with_missing_values 的 X 视为 X_test。

      【讨论】:

        【解决方案3】:

        直接将所有缺失值放到单独的dataframe中,然后使用train_test_split(...),可以使用布尔索引。

        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']])
        

        【讨论】:

          猜你喜欢
          • 2019-12-31
          • 1970-01-01
          • 2016-08-26
          • 2019-02-01
          • 2019-03-11
          • 2020-06-16
          • 1970-01-01
          • 2020-07-17
          • 1970-01-01
          相关资源
          最近更新 更多