【问题标题】:SciKit Learn when the data contains strings or boolean valuesSciKit 了解数据何时包含字符串或布尔值
【发布时间】:2021-09-12 09:49:25
【问题描述】:

我有一个看起来像这样的数据框(显然要大得多):

id     points isAvailable frequency   Score
abc1   325    True        93.0        0.01
def2   467    False       80.1        0.59
ghi3   122    True        90.3        1 
jkl4   546    True        84.0        0
mno5   355    False       93.5        0.99

我想看看pointsisAvailablefrequencyScore 的影响有多大。我想使用随机森林:

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
from matplotlib import pyplot as plt

plt.rcParams.update({'figure.figsize': (12.0, 8.0)})
plt.rcParams.update({'font.size': 14})

X = df
y = df['Score']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=12)
rf = RandomForestRegressor(n_estimators=100)
rf.fit(X_train, y_train)

我收到以下错误:ValueError: could not convert string to float: 'abc1'

问题:

  1. 如何预处理数据?布尔变量会发生什么变化?
  2. 在 X 中甚至包含 id 列是错误的吗?

我正在考虑使用 df = df.astype({"a": int, "b": complex}) 之类的东西,但我真的不知道在这种情况下如何使用,我读到有特殊的编码算法。

【问题讨论】:

  • 这个link 会很有帮助,但是由于您的目标是突出重要性及其对score 的影响,您可以查看这个source
  • @Mario 谢谢,这正是我从 mljar 链接中获取的。但现在我意识到我应该在 X 中添加一个额外的列,对于这些功能名称,我想?
  • 正确并使用SHAP 可以满足您的要求。您可以查看这些列/功能对输出的贡献,在您的情况下为 score

标签: python dataframe scikit-learn random-forest


【解决方案1】:

首先,您必须从X 数据集中删除score 列:它是您数据的标签,因此不应将其用作特征。

其次,假设id 列是您数据的标识符,您应该将其从X 中删除。这就像你试图分析一组人的体重数据集:你会删除他们的名字,因为他们的名字和他们的体重之间没有相关性。

最后,处理布尔变量,有一些编码方法,就像你说的(例如this one),但由于值只能是01,如果你应该没问题转换False = 0, True = 1 你可以用这段代码来做(假设df是你DataFrame的名字):

df['isAvailable'] = (df['isAvailable'] == True).astype(int)

【讨论】:

  • 我不认为score 意味着标签。它可以用于标记。
  • @Mario 分数是我计算/假设的,我想看看它受所有这些特性的影响有多大。
猜你喜欢
  • 2013-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 2018-07-15
  • 1970-01-01
  • 2013-08-17
  • 1970-01-01
相关资源
最近更新 更多