dlo*_*est 9 python machine-learning pandas
假设我有一个像下面这样的Pandas DataFrame,我正在编码categorical_1用于scikit-learn的培训:
data = {'numeric_1':[12.1, 3.2, 5.5, 6.8, 9.9],
'categorical_1':['A', 'B', 'C', 'B', 'B']}
frame = pd.DataFrame(data)
dummy_values = pd.get_dummies(data['categorical_1'])
Run Code Online (Sandbox Code Playgroud)
'categorical_1'的值是A,B或C,所以我最终在dummy_values中有3列.但是,categorical_1实际上可以采用值A,B,C,D或E,因此没有为值D或E表示的列.
在RI中,在指定该列时会指定级别 - 是否有相应的方法对Pandas执行此操作,还是需要手动处理?
在我看来,有必要考虑测试数据,在训练集中使用的值之外的那一列的值,但作为机器学习的新手,也许这是不必要的,所以我对不同的方式开放接近这个.
首先,如果您希望 pandas 获取更多值,只需将它们添加到发送到该get_dummies方法的列表中
data = {'numeric_1':[12.1, 3.2, 5.5, 6.8, 9.9],
'categorical_1':['A', 'B', 'C', 'B', 'B']}
frame = pd.DataFrame(data)
dummy_values = pd.get_dummies(data['categorical_1'] + ['D','E'])
Run Code Online (Sandbox Code Playgroud)
就像在Python中+的列表一样作为一个concatenate操作,所以
['A','B','C','B','B'] + ['D','E']
Run Code Online (Sandbox Code Playgroud)
结果是
['A', 'B', 'C', 'B', 'B', 'D', 'E']
Run Code Online (Sandbox Code Playgroud)
在我看来,有必要考虑测试数据,该列的值超出训练集中使用的值,但作为机器学习的新手,也许这没有必要,所以我愿意采用不同的方式接近这个。
从机器学习的角度来看,这是相当多余的。此列是分类列,因此值“D”对于模型来说完全没有任何意义,因为之前从未见过它。如果您正在对一元特征进行编码(我在看到您为每个值创建列后假设),那么只需简单地表示这些“D”、“E”值就足够了
A B C
0 0 0
Run Code Online (Sandbox Code Playgroud)
(我假设您用 表示“B”值0 1 0,用 等表示“C”值0 0 1)
因为如果训练集中没有这样的值,在测试期间 - 没有模型将区分给出值“D”或“大象”
执行此类操作的唯一原因是假设将来您希望添加具有“D”值的数据,并且只是不想修改代码,那么现在执行此操作是合理的,即使它可能会使训练有点复杂(因为您添加了一个目前完全不包含任何知识的维度),但这似乎是一个小问题。
如果您不打算以一元格式对其进行编码,而是希望将这些值用作一个特征,只需使用分类值,那么您根本不需要创建这些“虚拟对象”,并使用可以工作的模型具有这样的值,例如朴素贝叶斯,可以简单地使用“拉普拉斯平滑”进行训练,以便能够解决不存在的值。