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 模型,把训练集和验证集进行特征工程变为向量。
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)
这语句会报错,不知道什么原因?
留坑!! !