Python 分类:推特情绪分析-步骤顺序

Python 分类:推特情绪分析-步骤顺序,python,machine-learning,classification,sentiment-analysis,text-classification,Python,Machine Learning,Classification,Sentiment Analysis,Text Classification,我目前正在进行推特情绪分析,对于步骤的正确顺序有一些问题。请假设数据已经进行了预处理并进行了相应准备。因此,我将这样做: 使用列车测试\u分割(80:20比率)中止测试 数据集 矢量化x_train,因为tweet不是数字 在接下来的步骤中,我将确定最佳分类器。请假设这些已经进口。所以我会继续说: 超参数化(网格搜索),包括交叉验证方法。 在这一步中,我想确定每种方法的最佳参数 分类器。KNN的代码如下: 比较分类器的准确度(取决于最佳超参数) 选择最好的分类器 获取保留的测试数据集(来自训练测

我目前正在进行推特情绪分析,对于步骤的正确顺序有一些问题。请假设数据已经进行了预处理并进行了相应准备。因此,我将这样做:

  • 使用
    列车测试\u分割
    (80:20比率)中止测试 数据集
  • 矢量化
    x_train
    ,因为tweet不是数字
  • 在接下来的步骤中,我将确定最佳分类器。请假设这些已经进口。所以我会继续说:

  • 超参数化(网格搜索),包括交叉验证方法。 在这一步中,我想确定每种方法的最佳参数 分类器。KNN的代码如下:
  • 比较分类器的准确度(取决于最佳超参数)
  • 选择最好的分类器
  • 获取保留的测试数据集(来自
    训练测试分割()
    ),并对测试数据使用最佳分类器

  • 这是正确的方法还是你会建议改变一些东西(例如单独进行交叉验证而不是在超参数化中)?作为最后一步测试测试数据有意义吗?还是我应该更早地进行测试以评估未知数据集的准确性?

    有很多方法可以做到这一点,人们对此有强烈的意见,我并不总是确信他们完全理解他们的主张

    TL;博士:你的方法看起来很棒,你问的问题也很有道理

    话虽如此,以下是一些需要考虑的事情:

  • 你为什么要进行列车测试分离验证
  • 为什么要进行超参数调整
  • 你为什么要做交叉验证
  • 是的,这些技术中的每一种都擅长做一些特定的事情;但这并不意味着它们都应该是同一条管道的一部分

    首先,让我们回答以下问题:

  • 训练测试分割用于测试分类器的推理能力。换句话说,我们想知道分类器的总体性能(而不是我们用于训练的数据)。测试部分允许我们在不使用训练部分的情况下评估分类器

  • 超参数调整有助于评估超参数对分类器性能的影响。为了使其有意义,我们必须比较两个(或更多)模型(使用不同的超参数),但最好使用相同的训练部分进行训练(以消除选择偏差)。一旦我们知道性能最好的超参数,我们该怎么办?这组超参数是否总是最佳性能?不。您将看到,由于分类的随机性,一组超参数可能在实验A中效果最好,而另一组超参数可能在实验B中效果最好。相反,超参数调整有助于概括构建分类器时要使用的超参数

  • 交叉验证用于消除与构建分类器相关的一些随机性。因此,机器学习管道可能会产生一个分类器,使用一个测试折叠产生94%的准确度,使用另一个测试折叠产生83%的准确度。这是什么意思?这可能意味着1倍包含简单的样本。或者它可能意味着,无论出于何种原因,分类器实际上更好。你不知道,因为它是一个黑匣子

  • 实际上,这有什么帮助

    我认为使用测试序列分割和交叉验证没有什么价值。我使用交叉验证和报告准确性作为n倍的平均值。它已经在测试我的分类器的性能了。我不明白为什么进一步划分训练数据以进行另一轮训练测试验证会有所帮助。使用平均值。话虽如此,我使用交叉验证期间创建的n倍模型中性能最好的模型作为最终模型。正如我所说,这是一个黑匣子,所以我们无法知道哪种型号最好,但是,在其他条件相同的情况下,您最好使用性能最好的型号。实际上可能更好

    超参数调优是有用的,但进行广泛调优可能需要很长时间。我建议将超参数调优添加到管道中,但只测试2组超参数。所以,保持所有超参数不变,除了1。e、 g.批大小={64128}。运行它,您将能够自信地说,“哦,这产生了巨大的差异:64比128更好!”或“那是浪费时间。无论哪种方式,都没有太大的差异。”如果差异很小,请忽略该超参数,然后尝试另一对。这样,你就可以慢慢地朝着最佳的方向前进,而不会浪费所有的时间

    在实践中,我要说的是,将广泛的超参数调整留给学术界,采取更务实的方法


    但是,是的,你看起来很好。我认为你在思考自己在做什么,这已经让你领先了一步。

    非常感谢你详细的回答!如前所述,我计划使用CV来改进超参数调优,并且只使用以前分割的训练数据集。有没有办法在不考虑不同褶皱的情况下调整超参数?我刚刚开始学习ML,在我看来,超参数调优将从CV中受益是合乎逻辑的。我认为您认为超参数调优将从CV中受益是正确的。我的观点是,5倍CV是80:20列车试验分割验证x 5;因此,我认为使用列车测试(超参数调优(交叉验证(…))不会给您带来好处。可能只是使用超参数调优(交叉验证(…))。否则,在训练测试的测试部分,您将丢失20%的训练数据,然后每次折叠将丢失20%*80%(CV)。如果你有足够的数据,我想没关系。但对于我的用例来说,数据太复杂了
    model = KNeighborsClassifier()
    n_neighbors = range(1, 10, 2)
    weights = ['uniform', 'distance']
    metric = ['euclidean', 'manhattan', 'minkowski']
    
    # define grid search
    grid = dict(n_neighbors=n_neighbors, weights=weights ,metric=metric)
    cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
    grid_search = GridSearchCV(estimator=model, param_grid=grid, n_jobs=-1, cv=cv, scoring='accuracy',error_score=0)
    grid_result = grid_search.fit(train_tf, y_train)
    
    # summarize results
    print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_))
    means = grid_result.cv_results_['mean_test_score']
    stds = grid_result.cv_results_['std_test_score']
    params = grid_result.cv_results_['params']
    for mean, stdev, param in zip(means, stds, params):
        print("%f (%f) with: %r" % (mean, stdev, param))