【问题标题】:ValueError: could not convert string to float: 'Yes, policy' while fitting to my Logistic Regression ModelValueError:无法将字符串转换为浮点数:“是的,策略”同时适合我的逻辑回归模型
【发布时间】:2021-09-27 23:54:52
【问题描述】:

我正在使用 pandas 读取 excelsheet,excelsheet 的列超过 10,其中我只对 3 个感兴趣,所以我读取它,删除具有 Null 值的行,然后创建测试和验证集。在将其拟合到逻辑回归模型时,出现错误

这是代码

train, tv = train_test_split(df1, test_size=0.2, random_state=0)
test, val = train_test_split(tv, test_size=0.5, random_state=0)

# Logistic Regression
lr = LogisticRegression()
logit_model = lr.fit(train, test)

堆栈跟踪:

Traceback (most recent call last):
  File "ml.py", line 22, in <module>
    logit_model = lr.fit(train, test)
  File "F:\proj\venv\lib\site-packages\sklearn\linear_model\_logistic.py", line 1344, in fit
    X, y = self._validate_data(X, y, accept_sparse='csr', dtype=_dtype,
  File "F:\proj\venv\lib\site-packages\sklearn\base.py", line 433, in _validate_data
    X, y = check_X_y(X, y, **check_params)
  File "F:\proj\venv\lib\site-packages\sklearn\utils\validation.py", line 63, in inner_f
    return f(*args, **kwargs)
  File "F:\proj\venv\lib\site-packages\sklearn\utils\validation.py", line 871, in check_X_y
    X = check_array(X, accept_sparse=accept_sparse,
  File "F:\proj\venv\lib\site-packages\sklearn\utils\validation.py", line 63, in inner_f
    return f(*args, **kwargs)
  File "F:\proj\venv\lib\site-packages\sklearn\utils\validation.py", line 673, in check_array
    array = np.asarray(array, order=order, dtype=dtype)
  File "F:\proj\venv\lib\site-packages\pandas\core\generic.py", line 1990, in __array__
    return np.asarray(self._values, dtype=dtype)
ValueError: could not convert string to float: 'Yes, policy'

数据框看起来像这样:

 ID      ANSWER                                           TEXT
0  24100.0  Yes, policy  Source text snippet:The ACS Group combines its...
1  24100.0  Yes, policy  Source text snippet:The ACS Environmental Poli...
2  24100.0  Yes, policy  Source text snippet:The ACS Environmental Poli...
3  24100.0  Yes, policy  Source text snippet:6. CONTENTS OF THE ENVIRON...
4  24100.0  Yes, policy  Source text snippet:6. CONTENTS OF THE ENVIRON...

通过查看 valueerror,我认为这可能是因为 Answer 列中 Yes 之后的逗号,但即使在删除它之后也会出现相同的错误。 excel 中的 ID 看起来像 24100,但是当我在数据框中检查它的类型时,它显示为 float64 并显示为 24100.0。我不明白这一点,例如为什么在将其安装到模型上时会引发错误。

【问题讨论】:

  • 问题不在于文本字符串的内容,而在于它根本就是文本。您需要将文本转换为某种数值。您可以考虑将其转换为分类变量:pandas docs。不过,TEXT 列也会出现同样的问题,具体取决于包含分类变量的唯一值的数量,逻辑回归可能无法很好地执行。
  • @BrendanA。非常感谢您的帮助..会记住这一点。
  • Yes, Policy 是否出现在 Answer 列中?
  • @AdarshWase 它在那里,你可以在数据框中看到它

标签: python pandas machine-learning scikit-learn


【解决方案1】:

看起来您的 ANSWERTEXT 列包含分类值,您必须在将其输入模型之前以数字形式对它们进行编码。因为机器学习模型不理解文本。在使用train_test_split之前在数据框上使用此代码

    from sklearn.preprocessing import LabelEncoder

    df['TEXT'] = df['TEXT'].astype('str')
    df['ANSWER'] = df['ANSWER'].astype('str')
        
    df[['ANSWER', 'TEXT']] =  df[['ANSWER', 'TEXT']].apply(LabelEncoder().fit_transform)

另外,这是一个多类分类问题,所以Logistic Regression 不会给你很好的结果。使用RandomForestClassifier

【讨论】:

  • 请注意,上面代码中的df 是数据帧名称。请相应地更改它。而TEXTANSWER 是包含文本的列,如果您有任何其他文本列,则将该列名称添加到该列表中。
  • 非常感谢您的及时回复,最初我想检查逻辑回归,然后如果准确性较低,请尝试 RandomForest.. 但是我得到一个 ``` TypeError: Encoders require their input to be统一的字符串或数字。得到 ['float', 'int', 'str']``` 在你写的那段代码
  • 我假设在一列中有数字和字符串。在这种情况下,如果要将它们视为类别,则需要将所有内容编码为字符串。
  • 是的,我们必须将这些列的dtype 转换为str。我已经编辑了我的答案。
  • 我尝试使用多个模型,但所有模型的准确度都大大降低……例如,随机森林分类器的准确度为 0.1147。我做错什么了吗..?
猜你喜欢
  • 2020-10-16
  • 2019-10-22
  • 1970-01-01
  • 1970-01-01
  • 2021-06-04
  • 2018-11-19
  • 1970-01-01
  • 2019-02-08
  • 2019-03-23
相关资源
最近更新 更多