微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

分层KFold vs. train_test_split-使用什么训练数据?

如何解决分层KFold vs. train_test_split-使用什么训练数据?

我只是ML的初学者,请尝试了解(分层)KFold与传统的train_test_split相比到底有什么优势。

经典的train_test_split仅使用一部分进行训练(在这种情况下为75%)和一部分进行测试(在这种情况下为25%)。在这里,我确切地知道哪些数据点用于训练和测试(请参见代码

当使用(分层)Kfold进行拆分时,我们使用4次拆分,结果有4个不同的训练/测试部分。对我来说,尚不清楚这四个部分中的哪一个将用于训练/检验Logistic回归。以这种方式设置此拆分是否有意义?据我了解,(分层)Kfold的优点是您可以使用所有数据进行训练。我该如何更改代码才能实现这一目标?

创建数据

Add-Type -AssemblyName PresentationFramework
$employees = Get-ADUser -Filter {Surname -like "surname"}

$itemSource = @()

ForEach ($employee in $($employees | sort-object SamAccountName)) {

    $itemSource += [PSCustomObject]@{

        logon = $employee.Name
        FirstName = $employee.Givenname
        LastName = $employee.Surname

    }
}
[XML]$Form = (Get-Content "C:\temp\test.xaml")
$NR = (New-Object System.Xml.XmlNodeReader $Form)
$Win = [Windows.Markup.XamlReader]::Load($NR)
# this part
($win.FindName("ListView")).ItemsSource = $itemSource

$Win.ShowDialog()

train_test_split

import pandas as pd
import numpy as np
target = np.ones(25)
target[-5:] = 0
df = pd.DataFrame({'col_a':np.random.random(25),'target':target})
df

分层KFold


from sklearn.model_selection import train_test_split

X = df.col_a
y = df.target

X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.25,shuffle=True)
print("TRAIN:",X_train.index,"TEST:",X_test.index)

Output:
TRAIN: Int64Index([1,13,8,9,21,12,10,4,20,19,7,5,15,22,24,17,11,23],dtype='int64')
TEST: Int64Index([2,6,16,14,3,18],dtype='int64')

使用Logistic回归

from sklearn.model_selection import StratifiedKFold

X = df.col_a
y = df.target

skf = StratifiedKFold(n_splits=4)
for train_index,test_index in skf.split(X,y):
        X_train,X_test = X.loc[train_index],X.loc[test_index]
        y_train,y_test = y.loc[train_index],y.loc[test_index]
        print("TRAIN:",train_index,test_index)

Output: 
TRAIN: [ 5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 22 23 24] TEST: [ 0  1  2  3  4 20 21]
TRAIN: [ 0  1  2  3  4 10 11 12 13 14 15 16 17 18 19 20 21 23 24] TEST: [ 5  6  7  8  9 22]
TRAIN: [ 0  1  2  3  4  5  6  7  8  9 15 16 17 18 19 20 21 22 24] TEST: [10 11 12 13 14 23]
TRAIN: [ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 20 21 22 23] TEST: [15 16 17 18 19 24]

解决方法

首先,他们俩都做同样的事情,但是如何做才是不同的。

测试火车划分

测试训练拆分随机将数据拆分为测试集和训练集。除百分比分割外,没有其他规则。

您将只需要训练一个训练数据和一个用于测试模型的测试数据。

K折

数据随机分为测试和训练数据的多个组合。这里唯一的规则是组合的数量。

随机拆分数据的问题可能会导致类错误表示-即,在测试/火车拆分中,一个或多个目标类的表示量要多于其他类。这可能会导致模型训练中的偏见。

为避免这种情况,测试和训练拆分必须具有与目标类别相同的比例。这可以通过使用 StratifiedKFold 来实现。

链接: https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.StratifiedKFold.html#:~:text=Stratified%20K-Folds%20cross-validator%20Provides%20train%2Ftest%20indices%20to%20split,preserving%20the%20percentage%20of%20samples%20for%20each%20class

如果您喜欢观看视频(从〜4.30开始观看):https://youtu.be/gJo0uNL-5Qw

附注:如果您尝试使用kfold获得更好的培训,那么将StratifiedKFold与GridSearchCV结合使用可能会有所帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。