邏輯回歸模型
目標(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)記的線為
要畫這條線八酒,我們必須根據(jù)一個自變量來求解上述方程式。
指向相應(yīng)情感方向的紅線和綠線是使用與在先前方程式(負函數(shù))中計算出的分離線垂直的線來計算的刃唐。 它必須指向與Logit函數(shù)的導(dǎo)數(shù)相同的方向羞迷,但是幅度可能會有所不同。 它僅用于模型的可視化表示画饥。
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)