Python 无法将Scikit学习插补器应用于具有两个功能的数据集

Python 无法将Scikit学习插补器应用于具有两个功能的数据集,python,pandas,machine-learning,scikit-learn,data-science,Python,Pandas,Machine Learning,Scikit Learn,Data Science,我试图阅读完整的泰坦尼克号数据集,可以在这里找到: 当我运行除最后一行以外的所有行时,我得到以下警告: /Users/<username>/anaconda/lib/python3.6/site-packages/sklearn/utils/validation.py:395: DeprecationWarning: Passing 1d arrays as data is deprecated in 0.17 and will raise ValueError in 0.19.

我试图阅读完整的泰坦尼克号数据集,可以在这里找到:

当我运行除最后一行以外的所有行时,我得到以下警告:

/Users/<username>/anaconda/lib/python3.6/site-packages/sklearn/utils/validation.py:395: DeprecationWarning: Passing 1d arrays as data is deprecated in 0.17 and will raise ValueError in 0.19. Reshape your data either using X.reshape(-1, 1) if your data has a single feature or X.reshape(1, -1) if it contains a single sample.
  DeprecationWarning)
/Users//anaconda/lib/python3.6/site packages/sklearn/utils/validation.py:395:DeprecationWarning:在0.17中不推荐将1d数组作为数据传递,并将在0.19中引发ValueError。如果数据具有单个特征,请使用X.restrape(-1,1),如果数据包含单个样本,请使用X.restrape(1,-1)重塑数据。
弃用警告)
当我运行最后一行时,它抛出以下错误:

File "<ipython-input-2-07afef05ee1c>", line 1, in <module>
   X_male[:,0] = imputer.transform(X_male[:,0])
   ValueError: could not broadcast input array from shape (523) into shape (682)
文件“”,第1行,在
X_-male[:,0]=插补器.变换(X_-male[:,0])
ValueError:无法将输入数组从形状(523)广播到形状(682)

我已经在其他项目中使用了上面的代码片段进行插补,不知道为什么它不起作用。

一个快速解决方案是将
axis=0
更改为
axis=1
。这将使它工作,虽然我不确定这是否是你想要的。所以我想对这里发生的事情做如下解释:

警告基本上告诉您将数据解释为样本(行)与特征(列)的关系。在这个弃用过程中,假设您的数据只有一个样本(行),就会强制执行此要求。同时,您将
axis=0
传递给插补器,插补器通过
strategy='mean'
。但是,您现在只有一行。当遇到缺少的值时,无法替换该缺少的值。因此,整个列(仅包含此缺少的值)将被丢弃。如你所见,这等于

X_male[:,0][~np.isnan(X_male[:,0])].reshape(1, -1)
这就是为什么赋值
X_-male[:,0]=imputer.transform(X_-male[:,0])
失败的原因:
X_-male[:,0]
是形状(682),而
imputer.transform(X_-male[:,0])
是形状(523)。我以前的解决方案基本上将其更改为“沿行插补”,在这里您确实有替换缺失值的方法。这次你不会丢弃任何东西,你的
插补器。transform(X_-male[:,0])
是一个形状(682),可以分配给
X_-male[:,0]

现在我不知道为什么你的插补代码片段可以在其他项目上工作。对于您在这里的具体情况,一个(逻辑上)更好的关于弃用警告的方法是使用
X.reformate(-1,1)
,因为您的数据只有一个功能和682个示例。但是,在将转换后的数据分配给
X_male[:,0]

imputer = imputer.fit(X_male[:,0].reshape(-1, 1))
X_male[:,0] = imputer.transform(X_male[:,0].reshape(-1, 1)).reshape(-1)
imputer = imputer.fit(X_male[:,0].reshape(-1, 1))
X_male[:,0] = imputer.transform(X_male[:,0].reshape(-1, 1)).reshape(-1)