記一次二分類學習過程

(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,'排隊人太多,環(huán)境不好,口味一般')? #?0.5387091784756946
'好極了'?#?0.8150003099198344
'不好吃,下次不來了'? # 0.4197673887014011
'偶遇的很驚喜的店人非常多需要拼桌里很熱可能老廣州的店都這樣重在味道好強推雙皮奶和姜撞奶奶味超級足'? #?0.968618881251999
'這家店真不想再來一次一開始以為很好吃沒想到就這樣的味道真的無法接受跟你們說一下千萬別來誰來誰傻'? #?0.12606395529300188
'這家店真不想再來一次一開始以為很好吃沒想到就這樣的難吃但說實話味道也不會太難吃但還是好吃所以我推薦這間店真的不錯很好吃‘? #?0.23276097174516988
'這家店真想再來一次一開始以為很好吃沒想到就這樣的美味但說實話味道也不會太難吃但還是好吃所以我推薦這間店真的不錯很好吃'? #?0.7300467477143802
‘這破店真沒人會來吃’? #?0.5072788353863383
'這破店真每人會來吃'? #?0.8116153650177526
'難吃死掉'?#?0.025473639249854133
總結:
模型比較簡潔,效果一般,對于文本的分析不是很到位,沒有很好理清邏輯關系,但對于入門訓練而言挺有幫助。