NLP筆記Day3:邏輯回歸模型

邏輯回歸模型

目標(biāo):數(shù)據(jù)可視化颈娜,構(gòu)建邏輯回歸模型

步驟

  • 使用散點圖表示正向/負向推特的統(tǒng)計
  • 可視化線性回歸模型的輸出結(jié)果

導(dǎo)入庫

跟上兩篇筆記一樣锰什,首先需要導(dǎo)入庫,包括NLTK,pandas嗽冒,matplot,numpy钻心,關(guān)于這些庫都有官方文檔可查:

import nltk
from os import getcwd
import pandas as pd
from nltk.corpus import twitter_samples
import matplotlib.pyplot as plt
import numpy as np

from utils import process_tweet, build_freqs

加載NLTK樣本數(shù)據(jù)集

如果不知怎么那到數(shù)據(jù)集請翻看前文:

跟之前的加載步驟有所不同的是,這一次我們把數(shù)據(jù)集區(qū)分為 訓(xùn)練集 和 測試集旦委。

這是有監(jiān)督學(xué)習(xí)的基本操作,更多相關(guān)概念請參考:

all_positive_tweets = twitter_samples.strings('positive_tweets.json')
all_negative_tweets = twitter_samples.strings('negative_tweets.json')

tweets = all_positive_tweets + all_negative_tweets
labels = np.append(np.ones((len(all_positive_tweets),1)), np.zeros((len(all_negative_tweets),1)), axis = 0)

train_pos = all_positive_tweets[:4000]
train_neg = all_negative_tweets[:4000]

train_x = train_pos + train_neg

print("Number of tweets: ", len(train_x))
Number of tweets:  8000

加載提取特征

本周任務(wù)的一部分是創(chuàng)建Logistic回歸模型所需的數(shù)字特征雏亚。 為了不干擾它缨硝,我們之前已經(jīng)針對整個訓(xùn)練集計算并存儲了這些功能到CSV文件中。

因此罢低,請加載為推文示例創(chuàng)建的這些功能查辩。

data = pd.read_csv('logistic_features.csv');
data.head(10)

把 data frame 轉(zhuǎn)換成 numpy 數(shù)組

X = data[['bias', 'positive', 'negative']].values  # 大家可以自行測試一下如果用一個中括號會發(fā)生什么? 使用type()函數(shù)去看不同的調(diào)用方式有助于理解
Y = data['sentiment'].values;  # 為什么要使用分號网持?如果不用會怎么樣宜岛?

print(X.shape)
print(X)
(8000, 3)
[[  1.00000000e+00   3.02000000e+03   6.10000000e+01]
 [  1.00000000e+00   3.57300000e+03   4.44000000e+02]
 [  1.00000000e+00   3.00500000e+03   1.15000000e+02]
 ..., 
 [  1.00000000e+00   1.44000000e+02   7.83000000e+02]
 [  1.00000000e+00   2.05000000e+02   3.89000000e+03]
 [  1.00000000e+00   1.89000000e+02   3.97400000e+03]]

加載訓(xùn)練好的邏輯回歸模型

同樣的,作為這周作業(yè)的一部分功舀,邏輯回歸模型必須訓(xùn)練萍倡。下一個單元包含這樣的訓(xùn)練產(chǎn)生的模型。注意辟汰,一個包含3個數(shù)值的列表代表整個模型列敲,我們將其稱為theta??θ。

theta = [7e-08, 0.0005239, -0.00055517]

樣本數(shù)據(jù)可視化

向量theta代表一個將特征空間分為兩部分的平面帖汞。位于該平面上方的樣本被視為正戴而,而位于該平面下方的樣本被視為負。
請記住涨冀,我們有一個3D特征空間填硕,即每個推特都表示為一個由三個值組成的向量:[bias,positive_sum鹿鳖,negative_sum]扁眯,始終具有bias = 1。

如果忽略異常值翅帜,則可以使用positive_sum和negative_sum在笛卡爾平面中繪制每個tweet姻檀。
在下面的單元格中,我們正是這樣做的涝滴。
此外绣版,根據(jù)類別,我們?yōu)槊總€tweet上色歼疮。 正面推文將為綠色杂抽,負面推文將為紅色。

fig, ax = plt.subplots(figsize = (8,8))

colors = ['red', 'green']

ax.scatter(X[:,1], X[:,2], c=[colors[int(k)] for k in Y], s = 0.1) # positive列為散點圖的x軸韩脏,negative列為y軸
plt.xlabel("Positive")
plt.ylabel("Negative")
Text(0,0.5,'Negative')

如圖缩麸,正向和負向的特征向量幾乎完美分離。因此赡矢,可以期望此模型具有很高的準(zhǔn)確性杭朱。

在數(shù)據(jù)旁繪制模型

畫一條灰線作為正負區(qū)域的界限阅仔。灰線標(biāo)記的線為 z = \ theta * x = 0弧械。

要畫這條線八酒,我們必須根據(jù)一個自變量來求解上述方程式。

z = \theta * x = 0
x = [1, pos, neg]
z(\theta, x) = \theta_0+ \theta_1 * pos + \theta_2 * neg = 0
neg = (-\theta_0 - \theta_1 * pos) / \theta_2

指向相應(yīng)情感方向的紅線和綠線是使用與在先前方程式(負函數(shù))中計算出的分離線垂直的線來計算的刃唐。 它必須指向與Logit函數(shù)的導(dǎo)數(shù)相同的方向羞迷,但是幅度可能會有所不同。 它僅用于模型的可視化表示画饥。

direction = pos * \theta_2 / \theta_1

def neg(theta, pos):
    return (-theta[0] - pos * theta[1]) / theta[2]

def direction(theta, pos):
    return pos * theta[2] / theta[1]

圖表中的綠線指向z> 0的方向闭树,紅線指向z <0的方向。這些線的方向由權(quán)重??1θ1和??2給出

fig, ax = plt.subplots(figsize = (8,8))

colors = ['red', 'green']

ax.scatter(X[:,1], X[:,2], c=[colors[int(k)] for k in Y], s = 0.1)
plt.xlabel("Positive")
plt.ylabel("Negative")

maxpos = np.max(X[:,1])

offset = 5000

ax.plot([0, maxpos], [neg(theta, 0), neg(theta, maxpos)], color = 'gray')

ax.arrow(offset, neg(theta, offset), offset, direction(theta, offset), head_width=500, head_length=500, fc='g', ec='g')
ax.arrow(offset, neg(theta, offset), -offset, -direction(theta, offset), head_width=500, head_length=500, fc='r', ec='r')

plt.show()

請注意荒澡,比邏輯回歸本身更關(guān)鍵的是從推文中提取的特征,這些特征允許在此練習(xí)中獲得正確的結(jié)果与殃。

ChangeLog

  • 2021/2/3 14:57:15 完成整體代碼復(fù)現(xiàn)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末单山,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子幅疼,更是在濱河造成了極大的恐慌米奸,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件爽篷,死亡現(xiàn)場離奇詭異悴晰,居然都是意外死亡,警方通過查閱死者的電腦和手機逐工,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門铡溪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人泪喊,你說我怎么就攤上這事棕硫。” “怎么了袒啼?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵哈扮,是天一觀的道長。 經(jīng)常有香客問我蚓再,道長滑肉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任摘仅,我火速辦了婚禮靶庙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘实檀。我一直安慰自己惶洲,他們只是感情好按声,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著恬吕,像睡著了一般签则。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上铐料,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天渐裂,我揣著相機與錄音,去河邊找鬼钠惩。 笑死柒凉,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的篓跛。 我是一名探鬼主播膝捞,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼愧沟!你這毒婦竟也來了蔬咬?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤沐寺,失蹤者是張志新(化名)和其女友劉穎林艘,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體混坞,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡狐援,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了究孕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片啥酱。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蚊俺,靈堂內(nèi)的尸體忽然破棺而出懈涛,到底是詐尸還是另有隱情,我是刑警寧澤泳猬,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布批钠,位于F島的核電站,受9級特大地震影響得封,放射性物質(zhì)發(fā)生泄漏埋心。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一忙上、第九天 我趴在偏房一處隱蔽的房頂上張望拷呆。 院中可真熱鬧,春花似錦、人聲如沸茬斧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽项秉。三九已至绣溜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間娄蔼,已是汗流浹背怖喻。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留岁诉,地道東北人锚沸。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像涕癣,于是被迫代替她去往敵國和親哗蜈。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容