我正在运行几种机器学习模型以找到准确率得分最高的模型,然而,所有准确率得分都完全相同。我对社交媒体文本进行了自然语言处理,并训练我的模型根据NLTK确定的情感来标记情感。
我使用相同的训练和测试集,但我以前用过这种方法,在不同模型上得到了不同的分数。为什么我的所有分数都相同?我可能过拟合了吗?
这是我分割和训练的代码:
submissions_sentiment = submissions_df[["Clean_Body", "Clean_Title", "sentiment_label"]]dataset = submissions_sentimentX = dataset.iloc[:, :-1]y = dataset.iloc[:, -1].valuesX_arr = []for index, row in X.iterrows(): X_arr.append(row.values)from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X_arr, y, test_size = 0.2, random_state = 0)def identity_tokenizer(text): return textfrom sklearn.feature_extraction.text import CountVectorizervectorizer = CountVectorizer(tokenizer=identity_tokenizer, lowercase=False)# fit AND transform the model (only for training data)X_train_vectors = vectorizer.fit_transform(X_train)# transform the test dataX_test_vectors = vectorizer.transform(X_test)# Linear SVMfrom sklearn import svmclf_svm = svm.SVC(kernel="linear")clf_svm.fit(X_train_vectors, y_train)clf_svm_pred = clf_svm.predict(X_test_vectors)# Evaluate Model Accuracyfrom sklearn.metrics import accuracy_scoreaccuracy_score(y_test, clf_svm_pred) # Output is .86# Naive Bayesfrom sklearn.naive_bayes import GaussianNBclf_gnb = DecisionTreeClassifier()clf_gnb.fit(X_train_vectors, y_train)clf_gnb_pred = clf_gnb.predict(X_test_vectors)# Evaluate Model Accuracyaccuracy_score(y_test, clf_gnb_pred)# Output is .86
这是X-train的一个例子:
# Review data ouputprint(X_train_vectors.toarray())print(X_train[0])print(X_train_vectors[0])[[0 0 0 ... 0 0 0] [0 0 0 ... 0 0 0] [0 0 0 ... 0 0 0] ... [0 0 0 ... 0 0 0] [0 0 0 ... 0 0 0] [0 0 0 ... 0 0 0]]['我今年开始真正投资,并寻找长期持有的机会。大约五个月后,我决定暂时开始将资金投入到ETF中,同时我会进一步研究和了解公司。对于ETF,我考虑的有以下几个:VOO、QQQ。我正在寻找另一个非科技类别的ETF,以帮助分散我的持有。我在想XLC是否会是一个好的第三个ETF。我现在的计划是每个月将X金额投入到一个单一的ETF,然后下个月投入到下一个ETF,以此类推,基本上是持续将资金投入到这三个ETF中。我现在二十多岁,我的目标是长期持有,10到15年或更长时间。如果有人有其他ETF的建议,我将非常感激,因为我正在努力寻找合适的ETF来进入并希望随着时间的推移增长。提前感谢。' '哪些3个ETF适合分散投资并购买?'] (0, 517) 1 (0, 1007) 1
对于这个,y-train是1(正面)。
这是y_test和Kernel SVM的预测结果:
print(y_test)[ 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 -1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 -1 1 1 1 1 1 -1 -1 -1 1 -1 1 1 1 -1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 -1 1 1 1 1 1 1 -1 1 -1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 -1 1 1 1 1 1 1]print(clf_svm_pred)[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1]
等等。决策树的输出也相同。
我做错了什么吗?
回答:
我不确定问题的原因是什么,但由于您的SVM模型和DecisionTreeClassifier总是输出1,我建议您尝试更复杂的模型,如RandomForestClassifier,看看结果如何。
我之前有过类似的经历,无论我如何调整训练超参数,模型总是给出相同的性能指标——这可能是由以下两种可能性引起的:
- 我们的数据不适合模型,例如向量中的所有值都是零:[0, 0, 0, 0, 0, 0, 0]
- 我们的模型太简单,只能进行线性建模,因此无法学习太复杂的映射函数。
由于您的SVM是用线性核构建的,您能否尝试一个更复杂的模型,看看结果如何?您能否检查一下您的X_train_vectors矩阵中是否全是零?