基于sklearn的線性分類器logistics(對數(shù)幾率回歸)Python實現(xiàn)
聲明
:本人小白,文章作為自己的學(xué)習(xí)參考資料,供大家學(xué)習(xí)交流
本文章 refer to
作者:月見樽 鏈接:https://www.jianshu.com/p/f9cb59dc99ec 來源:簡書
作者: 周志華 書名:《機(jī)器學(xué)習(xí)》 出版社:清華大學(xué)出版社
感謝此文章及書籍原創(chuàng)者
如有侵犯您的知識產(chǎn)權(quán)和版權(quán)問題,請通知本人,本人會即時做出處理并刪除文章
Email:louhergetup@gmail.com
理論部分
線性分類器
特征與分類結(jié)果存在線性關(guān)系的模型為線性分類器,模型通過累積特征和對應(yīng)權(quán)值的方式?jīng)Q策,幾何學(xué)上可看成一個n維空間中的超平面,學(xué)習(xí)的過程就是不斷調(diào)整超平面的位置與傾斜程度,使該超平面可以最完美的將屬于不同類別的特征點區(qū)分開,公式為: f ( w , x , b ) = w T x + b f(w,x,b) = w^{T}x+b f ( w , x , b ) = w T x + b
logistic 函數(shù)
線性分類器輸出的是一個數(shù),我們希望這個數(shù)在區(qū)間[0,1]之間,需要一個映射關(guān)系,這個映射關(guān)系就是logistic函數(shù) g ( x ) = 1 1 + e ? x g(x) = \cfrac{1}{1 + e^{-x}} g ( x ) = 1 + e ? x 1 ? 下面使用numpy和matplot繪制該函數(shù)的圖像
x = np.linspace(start=-10,stop=10,num=1000)
y = 1 / (1 + np.exp(-x))
plt.plot(x,y)
plt.show()
將線性分類器公式帶入logistics函數(shù)后,可得logistics回歸模型
f ( x , w , b ) = 1 1 + e ? ( w T x + b ) f(x,w,b) = \cfrac{1}{1 + e{-(w{T}x+b)}}
f
(
x
,
w
,
b
)
=
1
+
e
?
(
w
T
x
+
b
)
1
?
對數(shù)幾率回歸
對數(shù)幾率回歸實際上是在用線性回歸模型的預(yù)測結(jié)果去逼近真實的對數(shù)幾率,特別需要注意的是雖然他的名字是“回歸”,但實際上卻是一種分類學(xué)習(xí)的方法,這種方法的優(yōu)點有很多,例如:
- 它是直接對分類可能性進(jìn)行建模,無需事先假設(shè)數(shù)據(jù)分布,這樣就避免了假設(shè)分布不準(zhǔn)所帶來的問題;
- 它不是僅預(yù)測“類別”,而是可得到近似概率預(yù)測,這對許多需利用概率輔助決策的任務(wù)很有用;
- 對率回歸求解的目標(biāo)函數(shù)是任意階可導(dǎo)的凸函數(shù),有很好的數(shù)學(xué)性質(zhì),現(xiàn)有的許多數(shù)值化算法都可直接用于求解最優(yōu)解。
使用python實現(xiàn)logistics
實驗環(huán)境
- 操作系統(tǒng):win10 64
- 編程語言:Python3.7.3
導(dǎo)入Python庫
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import re
import csv
from sklearn.feature_extraction import DictVectorizer
數(shù)據(jù)源
將這些數(shù)據(jù)記錄保存成
.csv
文件:
RID,age,income,student,credit_rating,class:buys_computer
1,youth,hight,no,fair,no
2,youth,hight,no,excellent,no
3,middle_aged,hight,no,fair,yes
4,senior,medium,no,fair,yes
5,senior,low,yes,fair,yes
6,senior,low,yes,excellent,no
7,middle_aged,low,yes,excellent,yes
8,youth,medium,no,fair,no
9,youth,low,yes,fair,yes
10,senior,medium,yes,fair,yes
11,youth,medium,yes,excellent,yes
12,middle_aged,medium,no,excellent,yes
13,middle_aged,hight,yes,fair,yes
14,senior,medium,no,excellent,no
這些數(shù)據(jù)即我們這次應(yīng)用的數(shù)據(jù)源
數(shù)據(jù)整理
利用python標(biāo)準(zhǔn)庫中
csv
對這個數(shù)據(jù)源進(jìn)行讀取
整理原始數(shù)據(jù)集,把隨機(jī)變量放在一個數(shù)組,分類結(jié)果放到另一個數(shù)組,形如:
future_list = [
{
"age" : "youth",
"income": "hight",
...
}
...
]
?
answer_list = ["no", "no", "yes", ...]
按照這個思路我們構(gòu)造一下:
data_file = open("computer_buy.csv", "r")
reader = csv.reader(data_file)
headers = next(reader)
future_list = []
label_list = []
for row in reader:
label_list.append(row[-1])
row_dict = {}
for i in range(1, len(row) - 1):
row_dict[headers[i]] = row[i]
future_list.append(row_dict)
data_file.close()
隨機(jī)變量向量化
在 sklearn 提供的庫中,對輸入的特征有一定的要求,所有特征和分類都要是數(shù)值型的值,不能是例子中的類別的值。
怎么轉(zhuǎn)化呢? 比方說 age 這個特征,它有三個值: youth , middle_aged , senior 。有一條記錄的 age=youth 針對這個特征我們就變成:
youth | middle_aged | senior |
---|---|---|
1 | 0 | 0 |
那么第一條記錄 youth,hight,no,fair 轉(zhuǎn)化為:
age=middle_aged | age=senior | age=youth | credit_rating=excellent | credit_rating=fair | credit_rating=fair | income=low | income=medium | student=no | student=yes |
---|---|---|---|---|---|---|---|---|---|
0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 1 | 0 |
特征向量化
vec = DictVectorizer()
dummy_x = vec.fit_transform(future_list).toarray()
print("dummy_x:", dummy_x)
print("vec.get_feature_names()", vec.get_feature_names())
特征向量化結(jié)果
dummy_x: [[0. 0. 1. 0. 1. 1. 0. 0. 1. 0.]
[0. 0. 1. 1. 0. 1. 0. 0. 1. 0.]
[1. 0. 0. 0. 1. 1. 0. 0. 1. 0.]
[0. 1. 0. 0. 1. 0. 0. 1. 1. 0.]
[0. 1. 0. 0. 1. 0. 1. 0. 0. 1.]
[0. 1. 0. 1. 0. 0. 1. 0. 0. 1.]
[1. 0. 0. 1. 0. 0. 1. 0. 0. 1.]
[0. 0. 1. 0. 1. 0. 0. 1. 1. 0.]
[0. 0. 1. 0. 1. 0. 1. 0. 0. 1.]
[0. 1. 0. 0. 1. 0. 0. 1. 0. 1.]
[0. 0. 1. 1. 0. 0. 0. 1. 0. 1.]
[1. 0. 0. 1. 0. 0. 0. 1. 1. 0.]
[1. 0. 0. 0. 1. 1. 0. 0. 0. 1.]
[0. 1. 0. 1. 0. 0. 0. 1. 1. 0.]]
分類結(jié)果向量化
from sklearn import preprocessing
lb = preprocessing.LabelBinarizer()
dummy_y = lb.fit_transform(label_list)
模型建立
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression()
模型訓(xùn)練
lr.fit(dummy_x, dummy_y)
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,
penalty='l2', random_state=None, solver='liblinear', tol=0.0001,
verbose=0, warm_start=False)
模型測試
from sklearn.metrics import classification_report
#測試數(shù)據(jù)
first_row = dummy_x[0, :]
new_row = list(first_row)
new_row[0] = 1
new_row[2] = 0
print(lr.score(dummy_x,dummy_y))
y_result = lr.predict(dummy_x)
print(classification_report(dummy_y, y_result, target_names=['NO', 'YES']))
0.8571428571428571
precision recall f1-score support
NO 1.00 0.60 0.75 5
YES 0.82 1.00 0.90 9
micro avg 0.86 0.86 0.86 14
macro avg 0.91 0.80 0.82 14
weighted avg 0.88 0.86 0.85 14
- classification_report()用于測試準(zhǔn)確率,精確率和召回率
- .score()用于評估本模型的準(zhǔn)確率
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
