【问题标题】:How to use logistic regression on test data如何对测试数据使用逻辑回归
【发布时间】:2019-10-22 15:42:00
【问题描述】:

我在我的泰坦尼克号模型上使用逻辑回归,PyCharm 要求我只传递带有布尔值的 DataFrame:

Traceback (most recent call last):
  File "C:/Users/security/Downloads/AP/Titanic-Kaggle/TItanic-Kaggle.py", line 29, in <module>
    predictions = logReg.predict(test[test_data])
  File "C:\Users\security\Anaconda3\envs\TItanic-Kaggle.py\lib\site-packages\pandas\core\frame.py", line 2914, in __getitem__
    return self._getitem_frame(key)
  File "C:\Users\security\Anaconda3\envs\TItanic-Kaggle.py\lib\site-packages\pandas\core\frame.py", line 3009, in _getitem_frame
    raise ValueError('Must pass DataFrame with boolean values only')
ValueError: Must pass DataFrame with boolean values only

我不明白为什么,因为在训练模型时在 Logistic 回归中使用了完全相同的特征,并且当时很受欢迎。这是我的代码(忽略代码重复。这是我要解决的问题):

import pandas as pd
import warnings
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split

warnings.filterwarnings("ignore", category=FutureWarning)

train = pd.read_csv("https://raw.githubusercontent.com/oo92/Titanic-Kaggle/master/train.csv")
test = pd.read_csv("https://raw.githubusercontent.com/oo92/Titanic-Kaggle/master/test.csv")

train['Sex'] = train['Sex'].replace(['female', 'male'], [0, 1])
train['Embarked'] = train['Embarked'].replace(['C', 'Q', 'S'], [1, 2, 3])
train['Age'].fillna(train.groupby('Sex')['Age'].transform("median"), inplace=True)
train['HasCabin'] = train['Cabin'].notnull().astype(int)
train['Relatives'] = train['SibSp'] + train['Parch']
train_data = train[['Pclass', 'Sex', 'Relatives', 'Fare', 'Age', 'Embarked', 'HasCabin']]
x_train, x_validate, y_train, y_validate = train_test_split(train_data, train['Survived'], test_size=0.22, random_state=0)

test['Sex'] = test['Sex'].replace(['female', 'male'], [0, 1])
test['Embarked'] = test['Embarked'].replace(['C', 'Q', 'S'], [1, 2, 3])
test['Age'].fillna(test.groupby('Sex')['Age'].transform("median"), inplace=True)
test['HasCabin'] = test['Cabin'].notnull().astype(int)
test['Relatives'] = test['SibSp'] + test['Parch']
test_data = test[['Pclass', 'Sex', 'Relatives', 'Fare', 'Age', 'Embarked', 'HasCabin']]

logReg = LogisticRegression()
logReg.fit(x_train, y_train)

predictions = logReg.predict(test[test_data])
submission = pd.DataFrame({'PassengerId': test['PassengerId'], 'Survived': predictions})

filename = 'Titanic-Submission.csv'
submission.to_csv(filename, index=False)

具体来说,Python 对此 sn-p 有异议:

test_data = test[['Pclass', 'Sex', 'Relatives', 'Fare', 'Age', 'Embarked', 'HasCabin']]

...

predictions = logReg.predict(test[test_data])

更新

我已将我的 predictions 变量更改为:

predictions = logReg.predict(test_data)

现在这是我的堆栈跟踪:

Traceback (most recent call last):
  File "C:/Users/security/Downloads/AP/Titanic-Kaggle/TItanic-Kaggle.py", line 29, in <module>
    predictions = logReg.predict(test_data)
  File "C:\Users\security\Anaconda3\envs\TItanic-Kaggle.py\lib\site-packages\sklearn\linear_model\base.py", line 281, in predict
    scores = self.decision_function(X)
  File "C:\Users\security\Anaconda3\envs\TItanic-Kaggle.py\lib\site-packages\sklearn\linear_model\base.py", line 257, in decision_function
    X = check_array(X, accept_sparse='csr')
  File "C:\Users\security\Anaconda3\envs\TItanic-Kaggle.py\lib\site-packages\sklearn\utils\validation.py", line 573, in check_array
    allow_nan=force_all_finite == 'allow-nan')
  File "C:\Users\security\Anaconda3\envs\TItanic-Kaggle.py\lib\site-packages\sklearn\utils\validation.py", line 56, in _assert_all_finite
    raise ValueError(msg_err.format(type_err, X.dtype))
ValueError: Input contains NaN, infinity or a value too large for dtype('float64').

这意味着我对测试数据的特征选择/工程没有通过

【问题讨论】:

  • logReg.predict(test_data) - 只需提供 test_data,您已经从测试中选择了必要的列/功能,所以只需通过 test_data
  • @Backtrack 看到这也是一个问题,因为我收到此错误ValueError: could not convert string to float: 'S',这意味着即使我清楚地将分类数据交换为数字数据,我的测试数据特征工程也没有通过。
  • Nvm 那个错误。我已修复它,但如果您不介意,请查看编辑。
  • 现在实际的问题是您在数据集中有 Null 值。您可以在预测之前进行这样的修复,test_data.dropna(axis=0)
  • 我不应该那样做。我已经在处理空值(检查上面的代码)

标签: python machine-learning scikit-learn logistic-regression kaggle


【解决方案1】:

x_validate 的预测没有问题。试试:

>>> predictions = logReg.predict(x_validate)

所以test_data 一定有问题。获取有关数据帧的一些信息并进行比较:

>>> x_validate.info(verbose=True)                                                                                                                                                          
<class 'pandas.core.frame.DataFrame'>
Int64Index: 197 entries, 495 to 45
Data columns (total 7 columns):
Pclass       197 non-null int64
Sex          197 non-null int64
Relatives    197 non-null int64
Fare         197 non-null float64
Age          197 non-null float64
Embarked     197 non-null int64
HasCabin     197 non-null int64
dtypes: float64(2), int64(5)
memory usage: 12.3 KB

>>> test_data.info(verbose=True)                                                                                                                                                           
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 418 entries, 0 to 417
Data columns (total 7 columns):
Pclass       418 non-null int64
Sex          418 non-null int64
Relatives    418 non-null int64
Fare         417 non-null float64
Age          418 non-null float64
Embarked     418 non-null int64
HasCabin     418 non-null int64
dtypes: float64(2), int64(5)
memory usage: 22.9 KB

看起来这里有一个 NaN:

Fare         417 non-null float64    

【讨论】:

  • 好的,我解决了。非常感谢。但我有一个问题(不想就此发表一整篇文章)。 LogisticRegression.score 给了我 83.76% 的准确率,但 Kaggle 将这个数字降低到了 76%。你知道为什么会这样吗?
  • @AndrosAdrianopolos 首先,这些模型中的每个结果都取决于初始随机种子,我想如果您多次运行脚本,您也会得到不同的结果。此外,您不知道 Kaggle 在哪个数据集上测试算法,因此这也说明了准确性结果的可变性。
  • 有道理。谢谢。\
【解决方案2】:

您在Fare 列中有一个NaN 值,而您没有处理该值。像您对Age 所做的那样替换它可以解决问题。这是模型的最佳解决方案吗?这是一个不同的论点,但这解决了问题。

train['Fare'].fillna(train.groupby('Sex')['Age'].transform("median"), inplace=True)
test['Fare'].fillna(train.groupby('Sex')['Age'].transform("median"), inplace=True)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-25
    • 2017-01-19
    • 2021-06-22
    • 2020-11-26
    • 2018-05-04
    • 2015-06-30
    • 2020-12-09
    • 2021-09-28
    相关资源
    最近更新 更多