如何解决分层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 来实现。
如果您喜欢观看视频(从〜4.30开始观看):https://youtu.be/gJo0uNL-5Qw
附注:如果您尝试使用kfold获得更好的培训,那么将StratifiedKFold与GridSearchCV结合使用可能会有所帮助。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。