我无法提高情绪分析的测试准确性
I can't get my test accuracy to increase in a sentiment analysis
我不确定这是否是正确的地方,但我的测试准确率始终在 0.40 左右,而我可以将训练集准确率提高到 1.0。我正在尝试对特朗普的推文进行情绪分析,我用正面、负面或中性的极性对每条推文进行了注释。我希望能够根据我的模型预测新数据的极性。我尝试过不同的模型,但 SVM 似乎给了我最高的测试精度。我不确定为什么我的数据模型准确性如此之低,但希望得到任何帮助或指导。
trump = pd.read_csv("trump_data.csv", delimiter = ";")
#drop all nan values
trump = trump.dropna()
trump = trump.rename(columns = {"polarity,,,":"polarity"})
#print(trump.columns)
def tokenize(text):
ps = PorterStemmer()
return [ps.stem(w.lower()) for w in word_tokenize(text)
X = trump.text
y = trump.polarity
X_train, X_test, y_train, y_test = train_test_split(X,y, test_size = .2, random_state = 42)
svm = Pipeline([('vectorizer', TfidfVectorizer(stop_words=stopwords.words('english'),
tokenizer=tokenize)), ('svm', SGDClassifier(loss='hinge', penalty='l2',alpha=1e-3,
random_state=42,max_iter=5, tol=None))])
svm.fit(X_train, y_train)
model = svm.score(X_test, y_test)
print("The svm Test Classification Accuracy is:", model )
print("The svm training set accuracy is : {}".format(naive.score(X_train,y_train)))
y_pred = svm.predict(X)
这是数据集文本列中字符串之一的示例
".@repbilljohnson 国会必须加强并推翻特朗普总统的歧视性#eo banning #immigrants & #refugees #oxfam4refugees"
Data set
为什么要使用 naive.score
?我认为这是一个 copy-paste
错误。以下是您可以遵循的几个步骤。
- 确保你有足够的数据点并清理它。
Cleaning
数据集是数据科学中不可避免的过程。
- 使用
ngram_range, max_df, min_df, max_features
等参数,同时使用 TfidfVectorizer or CountVectorizer. You may also try embeddings using Word2Vec. 对文本进行特征化
- 使用 GridSearch or RandomizedSearchCV 对
alpha, penalty
和其他变量进行超参数调整。确保您目前 CV
。有关详细信息,请参阅文档
- 如果数据集是
imbalanced
,则尝试使用其他矩阵,例如 log-loss, precision, recall, f1-score, etc
。有关详细信息,请参阅 this。
- 通过检查训练误差和测试误差,确保您的模型既不是
overfitted
也不是 underfitted
。
除了SVM
,也可以尝试传统模型,如Logistic Regression
、NV
、RF
等。如果你有大量的数据点,那么你可以尝试深度学习模型。
原来我需要清理极性数据集,因为它具有 "positive," 、 "positive,," 和 "positive,,," 等值,因此没有将它们注册为不同的,所以我只是删除了所有“ ”,来自专栏。
我不确定这是否是正确的地方,但我的测试准确率始终在 0.40 左右,而我可以将训练集准确率提高到 1.0。我正在尝试对特朗普的推文进行情绪分析,我用正面、负面或中性的极性对每条推文进行了注释。我希望能够根据我的模型预测新数据的极性。我尝试过不同的模型,但 SVM 似乎给了我最高的测试精度。我不确定为什么我的数据模型准确性如此之低,但希望得到任何帮助或指导。
trump = pd.read_csv("trump_data.csv", delimiter = ";")
#drop all nan values
trump = trump.dropna()
trump = trump.rename(columns = {"polarity,,,":"polarity"})
#print(trump.columns)
def tokenize(text):
ps = PorterStemmer()
return [ps.stem(w.lower()) for w in word_tokenize(text)
X = trump.text
y = trump.polarity
X_train, X_test, y_train, y_test = train_test_split(X,y, test_size = .2, random_state = 42)
svm = Pipeline([('vectorizer', TfidfVectorizer(stop_words=stopwords.words('english'),
tokenizer=tokenize)), ('svm', SGDClassifier(loss='hinge', penalty='l2',alpha=1e-3,
random_state=42,max_iter=5, tol=None))])
svm.fit(X_train, y_train)
model = svm.score(X_test, y_test)
print("The svm Test Classification Accuracy is:", model )
print("The svm training set accuracy is : {}".format(naive.score(X_train,y_train)))
y_pred = svm.predict(X)
这是数据集文本列中字符串之一的示例
".@repbilljohnson 国会必须加强并推翻特朗普总统的歧视性#eo banning #immigrants & #refugees #oxfam4refugees"
Data set
为什么要使用 naive.score
?我认为这是一个 copy-paste
错误。以下是您可以遵循的几个步骤。
- 确保你有足够的数据点并清理它。
Cleaning
数据集是数据科学中不可避免的过程。 - 使用
ngram_range, max_df, min_df, max_features
等参数,同时使用 TfidfVectorizer or CountVectorizer. You may also try embeddings using Word2Vec. 对文本进行特征化
- 使用 GridSearch or RandomizedSearchCV 对
alpha, penalty
和其他变量进行超参数调整。确保您目前CV
。有关详细信息,请参阅文档 - 如果数据集是
imbalanced
,则尝试使用其他矩阵,例如log-loss, precision, recall, f1-score, etc
。有关详细信息,请参阅 this。 - 通过检查训练误差和测试误差,确保您的模型既不是
overfitted
也不是underfitted
。
除了SVM
,也可以尝试传统模型,如Logistic Regression
、NV
、RF
等。如果你有大量的数据点,那么你可以尝试深度学习模型。
原来我需要清理极性数据集,因为它具有 "positive," 、 "positive,," 和 "positive,,," 等值,因此没有将它们注册为不同的,所以我只是删除了所有“ ”,来自专栏。