【问题标题】:Preprocessing categorical data already converted into numbers预处理已转换为数字的分类数据
【发布时间】:2017-08-23 06:26:49
【问题描述】:

我对机器学习还很陌生,所以我不知道正确的术语,但我通过以下方式将两个分类列转换为数字。这些列是我的特征输入的一部分,类似于 Titanic 数据库中的性别列。 (它们不是我已经创建的目标数据y

                           changed  p_changed  
Date                                       
2010-02-17   0.477182        0          0  
2010-02-18   0.395813        0          0  
2010-02-19   0.252179        1          1  
2010-02-22   0.401321        0          1  
2010-02-23   0.519375        1          1  

现在我的其余数据X看起来像这样

          Open  High   Low  Close    Volume  Adj Close  log_return  \
Date                                                                   
2010-02-17  2.07  2.07  1.99   2.03  219700.0       2.03   -0.019513   
2010-02-18  2.03  2.03  1.99   2.03  181700.0       2.03    0.000000   
2010-02-19  2.03  2.03  2.00   2.02  116400.0       2.02   -0.004938   
2010-02-22  2.05  2.05  2.02   2.04  188300.0       2.04    0.009852   
2010-02-23  2.05  2.07  2.01   2.05  255400.0       2.05    0.004890   

            close_open  Daily_Change  30_Avg_Vol  20_Avg_Vol  15_Avg_Vol  \
Date                                                                       
2010-02-17        0.00         -0.04    0.909517    0.779299    0.668242   
2010-02-18        0.00          0.00    0.747470    0.635404    0.543015   
2010-02-19        0.00         -0.01    0.508860    0.417706    0.348761   
2010-02-22        0.03         -0.01    0.817274    0.666903    0.562414   
2010-02-23        0.01          0.00    1.078411    0.879007    0.742730 

正如您所见,我的其余数据是连续的(包含许多变量),而不是只有两个值(0 和 1)的两个分类列。

我打算通过这种简单的预处理方法一次性预处理所有这些数据

X_scaled = preprocessing.scale(X)

我想知道这是不是错误?在使用这个简单的预处理之前,我还需要对分类值做些什么吗?

编辑:我尝试了两种方法;首先,我尝试缩放完整数据,包括转换为 1 和 0 的分类数据。

Full_X = OPK_df.iloc[:-5, 0:-5]
Full_X_scaled = preprocessing.scale( Full_X)   # First way, which scales everything in one shot. 

然后我尝试删除最后两列,缩放,然后通过此代码添加删除的列。

X =OPK_df.iloc[:-5, 0:-7]   # Here I'm dropping both -7 while originally the offset was only till -5, which means two extra columns were dropped. 

我创建了另一个数据框,其中包含我删除的那两列

 x2 =OPK_df.iloc[:-5, -7:-5]
 x2 = np.array(x2)   # convert it to an array


 # preprocessing the data without last two columns
   from sklearn import preprocessing
   X_scaled = preprocessing.scale(X)

# Then concact the X_scaled with x2(originally dropped columns)

   X =np.concatenate((X_scaled, x2), axis =1)


    #Creating a classifier

from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=5)
knn2 = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_scaled, y)
knn2.fit(X,y)


knn.score(Full_X_scaled, y)

0.71396522714526078


knn2.score(X, y)

0.71789119461581608

因此,当我在标准化过程中确实删除了两列时,得分会更高。

【问题讨论】:

    标签: machine-learning scikit-learn preprocessor


    【解决方案1】:

    到目前为止,你做得很好。 不要缩放您的分类数据。由于这些似乎是二元分类,因此将其视为“是”和“否”。扩展这些意味着什么?

    更糟糕的是,考虑到您可能有诸如花卉类型之类的分类:您已经编码了 Zinnia=0、Rose=1、Orchid=2 等。对这些进行缩放意味着什么?将这些重新编码为 Zinnia=-0.257、Rose=+0.448 等没有任何意义。

    缩放您的输入数据是必要的部分:它将值保持在可比较的范围内(数学影响),使您可以轻松地对损失函数使用单一处理。否则,值分布最大的特征将对训练产生最大的影响,直到您的模型的权重学会如何正确贴现大值。

    对于您的初步探索,不要进行任何其他预处理:只需缩放输入数据并开始您的拟合练习。

    【讨论】:

    • 嗨。我想我的措辞有误。最后两列changed p_changed 包含分类数据,是我输入数据的一部分。它类似于泰坦尼克号数据库中的sex。我的输出(分类)列是一个完全不同的列,我已经将其转换为y。那么我应该尝试删除这些删除列,然后缩放其余数据,然后再添加这些列吗?谢谢。
    • 啊;我知道了。是的,您完全正确:如果很容易避免,请不要缩放这些。这不会有什么坏处,但会使中间数据更难阅读。
    • 谢谢。我会尝试一下,看看它是否会提高我的分类器的分数。
    • 谢谢。通过删除列、缩放和添加列,我看到了轻微的改进。我想我做得对。 (我不像 Pandas 那样习惯使用 numpy)
    • 奇怪;我希望它对结果没有影响。准确性发生了变化——具有统计学意义?
    猜你喜欢
    • 2019-09-30
    • 1970-01-01
    • 2021-10-17
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多