记一次二分类学习过程

(jupyter notebook中运行, 小数精确度为6位)
先是导入
import pandas as pd
from matplotlib import pyplot as plt
import jieba
读取备好的csv数据
data = pd.read_csv('data-out.csv')
data.head() # 看一眼数据的头5行有个底

type(data) # <class 'pandas.core.frame.DataFrame'>
type(data['stars']) # <class 'pandas.core.series.Series'> 一列数据
def zhuanhuan(score): # 对打分程度stars进行二分类
if score > 3:
return 1
elif score < 3:
return 0
else:
return None
data['target'] = data['stars'].map(lambda x : zhuanhuan(x)) # 对data新添加一列数据

data_model = data.dropna() # 去掉None数据那一行
from sklearn.model_selection import train_test_split # 准备切分测试集、训练集
x_train, x_test, y_train, y_test = train_test_split(data_model['cus_comment'], data_model['target'], random_state=3, test_size=0.25) # 使用函数切分数据集


st = open('stopwords.txt',encoding='utf-8') # 导入我的停止词数据
stl = [i.strip() for i in st.readlines()] # 转换为列表
def fenci(train_data): # 定义一个中文分词函数
words_df = train_data.apply(lambda x:' '.join(jieba.cut(x)))
return words_df
# 使用TF-IDF进行文本转向量处理
from sklearn.feature_extraction.text import TfidfVectorizer
tv = TfidfVectorizer(stop_words=stl, max_features=5000, ngram_range=(1,2))
tv.fit(x_train)
# 计算分类效果的准确率
from sklearn.naive_bayes import MultinomialNB # 采用朴素贝叶斯方法
classifier = MultinomialNB()
classifier.fit(tv.transform(x_train), y_train) # 训练模型
# tv.transform()方法将文本转为向量,这样才能丢进训练
classifier.score(tv.transform(x_test), y_test)
def ceshi(model,strings): # 定义
strings_fenci = fenci(pd.Series([strings]))
return float(model.predict_proba(tv.transform(strings_fenci))[:,1])
# MultinomialNB.predict_proba() 得到预测为0的概率和预测为1的概率[(px1,px2),()]
test1 = '还会再来,非常喜欢'
test2 = '我不会来的。'
print(ceshi(classifier, test2)) # 0.9188640973630832
# model.predict_proba(tv.transform(strings_fenci)值:[[0.0811359 0.9188641]]
from sklearn.metrics import confusion_matrix # 引入混淆矩阵
y_predict = classifier.predict(tv.transform(x_test)) # 生成y预测label值
cm = confusion_matrix(y_test, y_predict) # 根据y的真实与预测值生成混淆矩阵
cm # array([[0, 2], [1, 1]], dtype=int64)
# 混淆矩阵格式
TN|FP
FN|TP
from sklearn.metrics import roc_auc_score # 引入计算ROC曲线下的AUC面积
roc_auc_score(y_test,y_predict) # 0.5598121490959593 不是很理想
index_tmp = y_train==0 # 取出label值等于0的index值,输出bool类型的 <class 'pandas.core.series.Series'>值
y_tmp = y_train[index_tmp]
x_tmp = x_train[index_tmp] # 存储label值为0的series
x_train2 = pd.concat([x_train,x_tmp,x_tmp,x_tmp,x_tmp,x_tmp,x_tmp,x_tmp,x_tmp,x_tmp,x_tmp])
# pd.concat() 列连接series
y_train2 = pd.concat([y_train,y_tmp,y_tmp,y_tmp,y_tmp,y_tmp,y_tmp,y_tmp,y_tmp,y_tmp,y_tmp])
# 以上一段操作将训练集扩大10倍,其中9成数据的label值为0
clf2 = MultinomialNB() # 重新实例一个朴素贝叶斯分析类
clf2.fit(tv.transform(x_train2), y_train2)
y_pred2 = clf2.predict_proba(tv.transform(x_test))[:,1]
roc_auc_score(y_test,y_pred2) # 0.9086147696182646,提高许多
y_predict2 = clf2.predict(tv.transform(x_test))
cm = confusion_matrix(y_test, y_predict2)
cm # array([[ 345, 114], [ 518, 4447]], dtype=int64)
# 测试
ceshi(clf2,'排队人太多,环境不好,口味一般') # 0.5387091784756946
'好极了' # 0.8150003099198344
'不好吃,下次不来了' # 0.4197673887014011
'偶遇的很惊喜的店人非常多需要拼桌里很热可能老广州的店都这样重在味道好强推双皮奶和姜撞奶奶味超级足' # 0.968618881251999
'这家店真不想再来一次一开始以为很好吃没想到就这样的味道真的无法接受跟你们说一下千万别来谁来谁傻' # 0.12606395529300188
'这家店真不想再来一次一开始以为很好吃没想到就这样的难吃但说实话味道也不会太难吃但还是好吃所以我推荐这间店真的不错很好吃‘ # 0.23276097174516988
'这家店真想再来一次一开始以为很好吃没想到就这样的美味但说实话味道也不会太难吃但还是好吃所以我推荐这间店真的不错很好吃' # 0.7300467477143802
‘这破店真没人会来吃’ # 0.5072788353863383
'这破店真每人会来吃' # 0.8116153650177526
'难吃死掉' # 0.025473639249854133
总结:
模型比较简洁,效果一般,对于文本的分析不是很到位,没有很好理清逻辑关系,但对于入门训练而言挺有帮助。