如果我遗漏了什么,我很抱歉,但我不知道为什么这不起作用:
using DataFrames, MLJjulia> df = DataFrame(A = 1:4, B = ["M", "F", "F", "M"])4×2 DataFrame│ Row │ A │ B ││ │ Int64 │ String │├─────┼───────┼────────┤│ 1 │ 1 │ M ││ 2 │ 2 │ F ││ 3 │ 3 │ F ││ 4 │ 4 │ M │julia> hot_model = OneHotEncoder()julia> hot = machine(hot_model, df)julia> fit!(hot)julia> Xt = MLJ.transform(hot, df)
Xt
与 df
完全相同,它没有转换列。我尝试在 OneHotEncoder()
中指定特征,但这并没有改变。我还看到可以通过包装它并在最后与模型一起拟合来创建管道,但它应该像那样工作,对吗?是不是因为列的类型?它应该是什么 scitype?是分类类型吗?我怎样才能将其更改为分类类型呢?
回答:
是的,你需要更改列的 scitypes。你可以通过在数据框上使用 schema
来检查每列的 scitype:
julia> schema(df)┌─────────┬─────────┬────────────┐│ _.names │ _.types │ _.scitypes │├─────────┼─────────┼────────────┤│ A │ Int64 │ Count ││ B │ String │ Textual │└─────────┴─────────┴────────────┘_.nrows = 4
在这里你可以看到列 B
的 scitype 是 Textual
,所以你需要将其更改为 Multiclass
。你可以使用 coerce
函数来更改列的 scitypes。请注意,在 MLJ 中,整数列被解释为计数数据,所以如果你希望列 A
代表连续数据,你也需要强制转换它。 coerce
方法的使用如下:
julia> coerce!(df, :A => Continuous, :B => Multiclass)4×2 DataFrame│ Row │ A │ B ││ │ Float64 │ Cat… │├─────┼─────────┼──────┤│ 1 │ 1.0 │ M ││ 2 │ 2.0 │ F ││ 3 │ 3.0 │ F ││ 4 │ 4.0 │ M │
现在单热编码器将正常工作。
ohe = machine(OneHotEncoder(), df)fit!(ohe)Xt = MLJ.transform(ohe, df)
4×3 DataFrame│ Row │ A │ B__F │ B__M ││ │ Float64 │ Float64 │ Float64 │├─────┼─────────┼─────────┼─────────┤│ 1 │ 1.0 │ 0.0 │ 1.0 ││ 2 │ 2.0 │ 1.0 │ 0.0 ││ 3 │ 3.0 │ 1.0 │ 0.0 ││ 4 │ 4.0 │ 0.0 │ 1.0 │
有关更多信息,请参阅 MLJ 手册中关于处理分类数据的部分。