关于train_test_split函数是不是打乱数据的验证

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于train_test_split函数是不是打乱数据的验证相关的知识,希望对你有一定的参考价值。

参考技术A 之前一直在使用 train_test_split 函数划分训练集和测试集,但是一直不清楚它是怎么划分的,有没有打乱数据集,如果直接在最后取部分数据作为测试集在某些数据集中是很影响训练效果的。验证如下:

结果发现,训练数据是被打乱了的

实际上 train_test_split 函数有三个参数:
train_test_split (*arrays,test_size, train_size, rondom_state=None, shuffle=True, stratify=None)
shuffle 默认为 True ,所以数据集是打乱的。

我们如何将显式测试数据和训练数据提供给 SVM,而不是使用 train_test_split 函数?

【中文标题】我们如何将显式测试数据和训练数据提供给 SVM,而不是使用 train_test_split 函数?【英文标题】:How can we give explicit test data and train data to SVM instead of using train_test_split function? 【发布时间】:2019-02-12 11:44:38 【问题描述】:

我计划明确地向算法提供测试和训练数据集,而不是使用 train_test_split 方法将数据随机拆分为测试和训练。

我想在测试和训练模型时将评论和标签数据保存在同一个文件中。

你们中的任何人都可以就同样的问题给我建议吗...

我的代码:

from sklearn.preprocessing import MultiLabelBinarizer
from sklearn.model_selection import train_test_split
from sklearn.svm import LinearSVC
from sklearn.metrics import average_precision_score
from sklearn.metrics import confusion_matrix

with open("/Users/xyz/Desktop/reviews.txt") as f:
    reviews = f.read().split("\n")
with open("/Users/xyz/Desktop/labels.txt") as f:
    labels = f.read().split("\n")

reviews_tokens = [review.split() for review in reviews]


onehot_enc = MultiLabelBinarizer()
onehot_enc.fit(reviews_tokens)


X_train, X_test, y_train, y_test = train_test_split(reviews_tokens, labels, test_size=0.20, random_state=None)

lsvm = LinearSVC()
lsvm.fit(onehot_enc.transform(X_train), y_train)
accuracy_score = lsvm.score(onehot_enc.transform(X_test), y_test)

print("Accuracy score of SVM:" , accuracy_score)

Test.txt

review,label
Colors & clarity is superb,positive
Sadly the picture is not nearly as clear or bright as my 40 inch Samsung,negative

火车.txt:

review,label
The picture is clear and beautiful,positive
Picture is not clear,negative

【问题讨论】:

【参考方案1】:

做你想做的。解决方法很简单:

X_train = reviews_tokens[:number_of_rows_of_train_data]
X_test = reviews_tokens[number_of_rows_of_train_data:]

y_trainy_test 执行相同操作。

当然,您需要知道文件中的哪些行用于训练,哪些行用于测试。

如果您想将要素和标签保留在同一个文件中 - 没问题。您将需要一个额外的步骤来将标签与要素分开。使用 pandas 会容易得多。

编辑

拥有您提供的文件,您可以像这样得到您想要的:

def load_data(filename):

    X = list()
    y = list()
    with open(filename) as file:
        file.readline()
        for line in file:
            line = line.strip().split(',')
            y.append(line[1])
            X.append(line[0].split())

    return X, y

X_train, y_train = load_data('train.txt')
X_test, y_test = load_data('test.txt')

【讨论】:

其实我的训练数据是amazon dataset,我的测试数据不一样。这不是亚马逊的数据。因此,我必须提供两个单独的文件用于测试和培训。我们该怎么做? @Inevitable 一步一步来。 1 - 加载训练数据集。 2 - 火车。 3 - 加载测试数据集。 4 - 测试。您已经使用您的代码完成了所有这些步骤,只需根据您的需要稍微修改一下即可。 其实这里我用了一个数据集,我把数据分成了test和tain,这个要求是不同的。但在我的其他要求之一中,我有两个数据集,一个应该专用于测试数据,另一个用于训练数据 @Inevitable 这些变体之间没有实际区别。这只是您如何存储数据的问题。不是你如何使用它。您能否提供指向您的数据集或数据集示例的链接(几行)? 嗨@Poolka,请找到编辑后的test.txt和train.txt文件

以上是关于关于train_test_split函数是不是打乱数据的验证的主要内容,如果未能解决你的问题,请参考以下文章

我们如何将显式测试数据和训练数据提供给 SVM,而不是使用 train_test_split 函数?

train_test_split, 关于随机抽样和分层抽样

用 numpy 编写一个 train_test_split 函数

train_test_split()函数

sklearn的train_test_split函数

划分训练、测试集和数据观察