Kaggle电影评论情感分析


  • kaggle没什么可怕的。
  • 简单的算法也很有效,逻辑回归打遍天下。
  • 数据预处理和特征工程很重要。

Kaggle竞赛网站:
https://www.kaggle.com/c/sentiment-analysis-on-movie-reviews

1. 导入数据集

import pandas as pd
data_train = pd.read_csv('./train.tsv', sep = '\t')
data_test = pd.read_csv('./test.tsv', sep = '\t')
data_train.head()
data_train.shape

2. 构建语料库

# 提取训练集中的文本内容
train_sentences = data_train['Phrase']

# 提取测试集中的文本内容
test_sentences = data_test['Phrase']

# 构建一个语料库。通过pandas中的contcat函数将训练集和测试集的文本内容合并到一起
sentences = pd.concat([train_sentence, test_sentence])

# 合并的一起的语料库的规模
sentences.shape
# 提取训练集中的情感标签
label = data_train['Sentiment']

# 导入停词库
stop_words = open('./stop_words.txt', encoding = 'utf-8').read().splitlines()

3. 特征工程

词袋模型,TF-IDF模型,word2vec模型进行文本的特征工程

3.1 构建模型
二选一:
词袋模型

from sklearn.feature_extraction.text import CountVectorizer
co = CountVectorizer(
    analyzer = 'word',
    ngram_range=(1,4),
    stop_words=stop_words,
    max_features=15000
)

TF-IDF模型

from sklearn.feature_extraction.text import TfidfVectorizer
tf = TfidfVectorizer(
    analyzer = 'word',
    ngram_range=(1,4),
    max_features=150000
)

3.2 训练模型
二选一:
co.fit(sentences)
tf.fit(sentences)

3.3 数据集拆分

将训练集随机拆分为新的训练集和验证集

from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(train_sentence, label,random_state = 1234)
#- x_train 训练集数据 (相当于课后习题)
#- x_test 验证集数据 (相当于模拟考试题)
#- y_train 训练集标签 (相当于课后习题答案)
#- y_test 验证集标签(相当于模拟考试题答案)

3.4 拆分后的训练集和验证集特征工程
二选一:
用词袋模型,把训练集和验证集进行特征工程变为向量。

x_train = co.transform(x_train)
x_test = co.transform(x_test)
#查看训练集中的一个数据
x_train[1]

用 TF-IDF 模型,把训练集和验证集进行特征工程变为向量。

扫描二维码关注公众号,回复: 12070200 查看本文章
x_train = tf.transform(x_train)
x_test = tf.transform(x_test)
x_train[1]

4. 构建分类器算法

4.1 多项式朴素贝叶斯分类器

from sklearn.naive_bayes import MultinomialNB
classifier = MultinomialNB()
classifier.fit(x_train,y_train)
print('词袋方法进行文本特征工程,使用sklearn默认的多项式朴素贝叶斯分类器,验证集上的预测正确率', classifier.score(x_test,y_test))

4.2 逻辑回归分类器

from sklearn.linear_model import LogisticRegression
#实例化一个逻辑回归类
lgl = LogisticRegression()
#训练模型
lgl.fit(x_train,y_train)
#预测正确率
print('词袋方法进行文本特征工程,使用sklearn默认的逻辑回归分类器,验证集上的预测正确率',lgl.score(x_test,y_test))

4.3 增加了2个参数的逻辑回归分类器

lg2 = LogisticRegression(C=3,dual=True,solver='liblinear')

超参数的网格搜索 GridSearchCV
在逻辑回归中增加C和dual这两个参数可以提高验证集上的预测准确率,每次手动太麻烦。

使用sklearn提供强大的网格搜索功能进行超参数的批量试验。
搜索空间:1-9。对每一个C,都分别尝试dual为True和False的两种参数。

最后从所有参数中跳出能够使模型在验证集预测准确率最高的。

from sklearn.model_selection import GridSearchCV
param_grid = {
    
     'C':range(1,10),
              'dual':[True,False]
}

lgGS = LogisticRegression()
grid = GridSearchCV(lgGS, param_grid=param_grid,cv=3, n_jobs=-1)
grid.fit(x_train,y_train)

#最优参数
grid.best_params_

#获取最佳模型
lg_final = grid.best_estimator_
print('经过网格搜索,找到最优超参数组合对应的逻辑回归模型,在验证集上的预测正确率', lg_final.score(x_test,y_test))

5. 对测试集的数据进行预测

#使用TF-IDF对测试集中的文本进行特征工程
test_X = tf.transform(data_test['Phrase'])

# 对测试集中的文本,使用lg_final逻辑回归分类器进行预测
predictions = lg_final.predict(test_X)

# 查看预测结果
predictions

#将测试结果加在测试集中
data_test.loc[:, 'Sentiment'] = predictions
data_test.head()

6. 按照kaggle比赛官网的要求整理格式


#loc通过索引标签来抽取数据:
final_data = data_test.loc[:,['PhraseId','Sentiment']]
final_data.head()

#保存为.csv文件,即为最终结果
final_data.to_csv('final_data.csv',index=None)

疑问

lg2 = LogisticRegression(C=3,dual=True)

这语句会报错,不知道什么原因?
留坑!! !

猜你喜欢

转载自blog.csdn.net/Cirtus/article/details/109320548