【问题标题】:Change normalized integer values to categories for classification将归一化的整数值更改为类别以进行分类
【发布时间】:2019-10-29 18:45:56
【问题描述】:

我正在使用以下列、N/A 计数和记录示例处理此数据集:

  Serial No.           0
  GRE Score            0
  TOEFL Score          0
  University Rating    0
  SOP                  0
   LOR                  0
  CGPA                 0
 Research             0
 Chance of Admit      0
 dtype: int64
  0: 1 337 118 4 4.5 4.5 9.65 1 0.92
  1: 2 324 107 4 4.0 4.5 8.87 1 0.76

承认的机会是一个标准化的整数值,范围从 0 到 1,我想要做的是获取这个列并输出一个相应的有序值,其中机会是箱(低中高)(不太可能可行)等

我遇到的是,pandas 有一个名为 to_categorical 的内置函数,但是我不太了解它,我读到的内容我仍然不完全明白。

此数据集将用于决策树,其中标签是承认的机会

感谢您的帮助

【问题讨论】:

  • 您好,请附上您的数据样本
  • @DanielMesejo 0: 1 337 118 4 4.5 4.5 9.65 1 0.92
  • 我的意思是你的问题
  • @DanielMesejo 抱歉,是的,我添加了两条记录,我认为没有好的方法,只是实现一个应用于数据框的函数

标签: python pandas dataframe


【解决方案1】:

既然它们是“标准化”值……为什么需要对它们进行分类?一个简单的阈值应该可以正常工作吗?

即 0-0.33 低 0.33-0.66 中等 0.66-1.0高

您想要使用自动化方法的唯一原因可能是您的类别数量不断变化?

要进行分类,您可以使用 pandas to_categorical 但您需要确定 bin(分类)的范围和数量。从文档中我认为这应该可行。

In [6]: df = pd.DataFrame({'value': np.random.randint(0, 100, 20)})

In [7]: labels = ["{0} - {1}".format(i, i + 9) for i in range(0, 100, 10)]

In [8]: df['group'] = pd.cut(df.value, range(0, 105, 10), right=False, labels=labels)

In [9]: df.head(10)
Out[9]: 
   value    group
0     65  60 - 69
1     49  40 - 49
2     56  50 - 59
3     43  40 - 49
4     43  40 - 49
5     91  90 - 99
6     32  30 - 39
7     87  80 - 89
8     36  30 - 39
9      8    0 - 9

然后,您可以将 df['group'] 替换为您的承认机会列,并根据阈值或根据箱数自动填充离散箱的必要范围。

供您参考:

https://pandas.pydata.org/pandas-docs/stable/user_guide/categorical.html

【讨论】:

  • @Jason.Chia 这正是我想要的,我现在只是编写一个自定义 python 函数,它使用 if-else 语句,但我知道有更好的方法非常感谢
【解决方案2】:

IIUC,您想将连续变量映射到基于范围的分类值,例如:

0.96 -> high, 
0.31 -> low
...

所以 pandas 提供了一个函数,cut,来自文档:

当您需要将数据值分段和分类到 bin 中时,请使用 cut。这个 函数对于从连续变量到 分类变量。

设置

   Serial No.  GRE Score  TOEFL Score  ...  CGPA  Research  Chance of Admit
0           1        337          118  ...  9.65         1             0.92
1           2        324          107  ...  8.87         1             0.76
2           2        324          107  ...  8.87         1             0.31
3           2        324          107  ...  8.87         1             0.45

[4 rows x 9 columns]

假设上述设置,您可以像这样使用cut

labels = pd.cut(df['Chance of Admit'], [0, 0.33, 0.66, 1.0], labels=['low', 'medium', 'high'])
print(labels)

输出

0      high
1      high
2       low
3    medium
Name: Chance of Admit, dtype: category
Categories (3, object): [low < medium < high]

请注意,我们使用了 3 个 bin:[(0, 0.33], (0.33, 0.66], (0.66, 1.0]]Chance of Admit 列的值是 [0.92, 0.76, 0.31, 0.45]。如果要更改标签名称,只需更改标签参数的值,例如:labels=['unlikely', 'doable', 'likely']。如果您需要序数值,请执行以下操作:

labels = pd.cut(df['Chance of Admit'], [0, 0.33, 0.66, 1.0], labels=list(range(3)))
print(labels)

输出

0    2
1    2
2    0
3    1
Name: Chance of Admit, dtype: category
Categories (3, int64): [0 < 1 < 2]

最后,您可以执行以下操作将其添加到您的 DataFrame:

df['group'] = pd.cut(df['Chance of Admit'], [0, 0.33, 0.66, 1.0], labels=['low', 'medium', 'high'])
print(df)

输出

   Serial No.  GRE Score  TOEFL Score  ...  Research  Chance of Admit   group
0           1        337          118  ...         1             0.92    high
1           2        324          107  ...         1             0.76    high
2           2        324          107  ...         1             0.31     low
3           2        324          107  ...         1             0.45  medium

[4 rows x 10 columns]

【讨论】:

    猜你喜欢
    • 2015-01-18
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    相关资源
    最近更新 更多