我正在尝试对包含3个分类变量的数据集应用回归(使用XGBRegressor)。
X_data
severity -> values S1,S2,S3priority -> values P1,P2,P3cluster -> values a,b,c,d
y_data要预测的标签是数值
为了将所有3列转换为分类变量,我使用:
pd.get_dummies(X_data['thecolumn'],drop_first =True)
转换所有变量后,我得到了7个新列(考虑到我总是删除第一列)。在应用算法时,来自priority或cluster的列是否会被误解为severity的第三列?我可能没有理解这个概念,但我看不出如何保持引用,我担心我做得不对。
回答:
不会。来自priority或cluster的列不会被误解为severity的第三列。
关于如何保持引用的回答如下:
在pandas.get_dummies
中有一个参数,即drop_first
,它允许你选择是否保留或删除引用(是否保留k个分类级别中的k个或k-1个虚拟变量)。
请注意,drop_first = False
意味着不删除引用,并从k个分类级别中创建k个虚拟变量!你设置drop_first = True
,然后它会在编码后删除引用列。
这里是关于独热编码的链接。
在你的例子中,severity
有3个类别S1、S2和S3。在创建虚拟变量后,这些类别中的一个总是1,其他的是0。
对于s1,它将是[1,0,0],s2将是[0,1,0],s3将是[0,0,1]
现在如果你删除了类别s1的列。
如果severity是S1,值将是[0,0]
如果severity是S2,值将是[1,0]
如果severity是S3,值将是[0,1]。
所以这里没有信息丢失,你的模型需要处理的列少了一个。这就是为什么总是建议将drop_first
参数设置为True
。
编辑:
应用虚拟变量后,你将得到如下列:
severity_S1 severity_S2 severity_S3 1 0 0 # 当值为S1时 0 1 0 # 当值为S2时 0 0 1 # 当值为S3时
pandas.get_dummies()
在创建上述引用后删除第一列。所以你的数据将如下所示:
severity_S2 severity_S3 0 0 # 当值为S1时 1 0 # 当值为S2时 0 1 # 当值为S3时
对于所有这些变量,你的最终数据将如下所示:由于空间问题,我使用了简短的列名:
s2 s3 p2 p3 B C D0 0 1 0 1 0 0 # 对于S1, P2和B的行0 1 0 1 0 1 0 # 对于S3, P3和C的行1 0 0 0 0 0 1 # 对于S2, P1和D的行1 0 0 0 0 0 0 # 对于S2, P1和A的行