在 Julia 中将数据集拆分为训练和测试

Moh*_*aad 5 julia train-test-split

我正在尝试将数据集拆分为 Julia 中的训练子集和测试子集。到目前为止,我已经尝试使用MLDataUtils.jl包进行此操作,但是结果未达到预期。\n以下是我的发现和问题:

\n

代码

\n
# the inputs are\n\na = DataFrame(A = [1, 2, 3, 4,5, 6, 7, 8, 9, 10],\n              B = [1, 2, 3, 4,5, 6, 7, 8, 9, 10],\n              C = [1, 2, 3, 4,5, 6, 7, 8, 9, 10]\n             )\nb = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n\nusing MLDataUtils\n(x1, y1), (x2, y2) = stratifiedobs((a,b), p=0.7)\n\n#Output of this operation is: (which is not the expectation)\nprintln("x1 is: $x1")\nx1 is:\n10\xc3\x973 DataFrame\n\xe2\x94\x82 Row \xe2\x94\x82 A     \xe2\x94\x82 B     \xe2\x94\x82 C     \xe2\x94\x82\n\xe2\x94\x82     \xe2\x94\x82 Int64 \xe2\x94\x82 Int64 \xe2\x94\x82 Int64 \xe2\x94\x82\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xa4\n\xe2\x94\x82 1   \xe2\x94\x82 1     \xe2\x94\x82 1     \xe2\x94\x82 1     \xe2\x94\x82\n\xe2\x94\x82 2   \xe2\x94\x82 2     \xe2\x94\x82 2     \xe2\x94\x82 2     \xe2\x94\x82\n\xe2\x94\x82 3   \xe2\x94\x82 3     \xe2\x94\x82 3     \xe2\x94\x82 3     \xe2\x94\x82\n\xe2\x94\x82 4   \xe2\x94\x82 4     \xe2\x94\x82 4     \xe2\x94\x82 4     \xe2\x94\x82\n\xe2\x94\x82 5   \xe2\x94\x82 5     \xe2\x94\x82 5     \xe2\x94\x82 5     \xe2\x94\x82\n\xe2\x94\x82 6   \xe2\x94\x82 6     \xe2\x94\x82 6     \xe2\x94\x82 6     \xe2\x94\x82\n\xe2\x94\x82 7   \xe2\x94\x82 7     \xe2\x94\x82 7     \xe2\x94\x82 7     \xe2\x94\x82\n\xe2\x94\x82 8   \xe2\x94\x82 8     \xe2\x94\x82 8     \xe2\x94\x82 8     \xe2\x94\x82\n\xe2\x94\x82 9   \xe2\x94\x82 9     \xe2\x94\x82 9     \xe2\x94\x82 9     \xe2\x94\x82\n\xe2\x94\x82 10  \xe2\x94\x82 10    \xe2\x94\x82 10    \xe2\x94\x82 10    \xe2\x94\x82\n\nprintln("y1 is: $y1")\ny1 is:\n10-element Array{Int64,1}:\n  1\n  2\n  3\n  4\n  5\n  6\n  7\n  8\n  9\n 10\n\n# but x2 is printed as \n(0\xc3\x973 SubDataFrame, Float64[]) \n\n# while y2 as \n0-element view(::Array{Float64,1}, Int64[]) with eltype Float64)\n
Run Code Online (Sandbox Code Playgroud)\n

但是,我希望将此数据集分为两部分,其中 70% 的数据在训练中,30% 的数据在测试中。\n请建议一种更好的方法在 julia 中执行此操作。\n提前致谢。

\n

Bog*_*ski 7

也许 MLJ.jl 开发人员可以向您展示如何使用通用生态系统来做到这一点。这是仅使用 DataFrames.jl 的解决方案:

\n
julia> using DataFrames, Random\n\njulia> a = DataFrame(A = [1, 2, 3, 4,5, 6, 7, 8, 9, 10],\n                     B = [1, 2, 3, 4,5, 6, 7, 8, 9, 10],\n                     C = [1, 2, 3, 4,5, 6, 7, 8, 9, 10]\n                    )\n10\xc3\x973 DataFrame\n Row \xe2\x94\x82 A      B      C     \n     \xe2\x94\x82 Int64  Int64  Int64 \n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82     1      1      1\n   2 \xe2\x94\x82     2      2      2\n   3 \xe2\x94\x82     3      3      3\n   4 \xe2\x94\x82     4      4      4\n   5 \xe2\x94\x82     5      5      5\n   6 \xe2\x94\x82     6      6      6\n   7 \xe2\x94\x82     7      7      7\n   8 \xe2\x94\x82     8      8      8\n   9 \xe2\x94\x82     9      9      9\n  10 \xe2\x94\x82    10     10     10\n\njulia> function splitdf(df, pct)\n           @assert 0 <= pct <= 1\n           ids = collect(axes(df, 1))\n           shuffle!(ids)\n           sel = ids .<= nrow(df) .* pct\n           return view(df, sel, :), view(df, .!sel, :)\n       end\nsplitdf (generic function with 1 method)\n\njulia> splitdf(a, 0.7)\n(7\xc3\x973 SubDataFrame\n Row \xe2\x94\x82 A      B      C     \n     \xe2\x94\x82 Int64  Int64  Int64 \n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82     3      3      3\n   2 \xe2\x94\x82     4      4      4\n   3 \xe2\x94\x82     6      6      6\n   4 \xe2\x94\x82     7      7      7\n   5 \xe2\x94\x82     8      8      8\n   6 \xe2\x94\x82     9      9      9\n   7 \xe2\x94\x82    10     10     10, 3\xc3\x973 SubDataFrame\n Row \xe2\x94\x82 A      B      C     \n     \xe2\x94\x82 Int64  Int64  Int64 \n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82     1      1      1\n   2 \xe2\x94\x82     2      2      2\n   3 \xe2\x94\x82     5      5      5)\n
Run Code Online (Sandbox Code Playgroud)\n

我使用视图来节省内存,但如果您愿意,您也可以具体化训练和测试数据帧。

\n