预处理已转换为数字的分类数据
Preprocessing categorical data already converted into numbers
我是机器学习的新手,所以我不知道正确的术语,但我通过以下方式将两个分类列转换为数字。这些列是我的特征输入的一部分,类似于泰坦尼克号数据库中的性别列。
(它们不是我已经创建的目标数据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
因此,当我在标准化过程中确实删除了两列时,得分会更高。
到目前为止你做得很好。 不要 缩放分类数据。由于这些似乎是二元分类,因此将其视为 "Yes" 和 "No"。扩展这些是什么意思?
更糟糕的是,考虑到您可能有诸如花卉类型之类的分类:您已将 Zinnia=0、Rose=1、Orchid=2 等编码。缩放它们意味着什么?将它们重新编码为 Zinnia=-0.257、Rose=+0.448 等没有任何意义
缩放您的 输入 数据是必要的部分:它将值保持在可比较的范围内(数学影响),使您可以轻松地对损失函数使用单一处理。否则,值分布最大的特征会对训练产生最大影响,直到您的模型的权重学会如何正确地对大值进行折扣。
对于您的初步探索,不要进行任何其他预处理:只需缩放输入数据并开始您的拟合练习。
我是机器学习的新手,所以我不知道正确的术语,但我通过以下方式将两个分类列转换为数字。这些列是我的特征输入的一部分,类似于泰坦尼克号数据库中的性别列。
(它们不是我已经创建的目标数据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
因此,当我在标准化过程中确实删除了两列时,得分会更高。
到目前为止你做得很好。 不要 缩放分类数据。由于这些似乎是二元分类,因此将其视为 "Yes" 和 "No"。扩展这些是什么意思?
更糟糕的是,考虑到您可能有诸如花卉类型之类的分类:您已将 Zinnia=0、Rose=1、Orchid=2 等编码。缩放它们意味着什么?将它们重新编码为 Zinnia=-0.257、Rose=+0.448 等没有任何意义
缩放您的 输入 数据是必要的部分:它将值保持在可比较的范围内(数学影响),使您可以轻松地对损失函数使用单一处理。否则,值分布最大的特征会对训练产生最大影响,直到您的模型的权重学会如何正确地对大值进行折扣。
对于您的初步探索,不要进行任何其他预处理:只需缩放输入数据并开始您的拟合练习。