邏輯回歸脉漏,又稱logistic回歸分析苞冯,是一種廣義的線性回歸分析模型。
下面是回歸分析的分類思維導(dǎo)圖:
邏輯回歸是很多分類算法的基礎(chǔ)組件鸠删,它的好處是輸出值自然地落在0到1之間抱完,并且有概率意義。因?yàn)樗举|(zhì)上是一個(gè)線性的分類器刃泡,雖然很多時(shí)候效果一般巧娱,卻勝在模型清晰碉怔,背后的概率學(xué)經(jīng)得住推敲,它擬合出來(lái)的參數(shù)就代表了每一個(gè)特征(feature)對(duì)結(jié)果的影響禁添。
本篇文章撮胧,我們主要介紹如果利用邏輯回歸進(jìn)行圖片分類。
首先老翘,我們利用 sklearn.datasets 庫(kù)中的 fetch_lfw_people 數(shù)據(jù)集芹啥,這個(gè)數(shù)據(jù)集中有1288 張人臉圖片,對(duì)應(yīng)的是7個(gè)公眾人物('Ariel Sharon' ,'Colin Powell' ,'Donald Rumsfeld', 'George W Bush',
'Gerhard Schroeder' ,'Hugo Chavez' ,'Tony Blair')铺峭。我們用邏輯回歸對(duì)訓(xùn)練數(shù)據(jù)集進(jìn)行建模墓怀,然后對(duì)測(cè)試數(shù)據(jù)集進(jìn)行準(zhǔn)確性驗(yàn)證。
進(jìn)行數(shù)據(jù)導(dǎo)入卫键,初步的探索:
from sklearn.datasets import fetch_lfw_people
#加載數(shù)據(jù)
lfw_people=fetch_lfw_people(min_faces_per_person=70,resize=0.4)
n_samples,h,w=lfw_people.images.shape
#X作為邏輯回歸的自變量
X=lfw_people.data
#有作為因變量
y=lfw_people.target
n_features=X.shape[1]
#輸出圖片集的屬性傀履,可以看到有1288張圖片,每張圖片有1850個(gè)特征
print(X.shape)
繼續(xù)做更多的探索:
#導(dǎo)入 matplotlib 作為畫圖工具
import matplotlib.pyplot as plt
%matplotlib inline
plt.imshow(X[0].reshape((h,w)),cmap=plt.cm.gray)
#輸入一個(gè)樣本圖片的人物名稱
print(lfw_people.target_names[y[0]])
target_names=lfw_people.target_names
n_classes=target_names.shape[0]
#輸出樣本數(shù)據(jù)集的屬性
print("Total dataset size: n_samples",n_samples,"n_features:",n_features,"n_classes:",n_classes)
對(duì)更多圖片進(jìn)行瀏覽:
def plot_grid(images,titles,n_row=3,n_col=4):
plt.figure(figsize=(1.8*n_col,2.4*n_row))
plt.subplots_adjust(bottom=0,left=.01,right=.99,top=.90,hspace=.35)
for i in range(n_row*n_col):
plt.subplot(n_row,n_col,i+1)
plt.imshow(images[i],cmap=plt.cm.gray)
#plt.imshow(images[i])
plt.title(titles[i],size=12)
eigenface_titles=[lfw_people.target_names[y[i]] for i in range(75)]
plot_grid(X[:75].reshape((n_components,h,w)),eigenface_titles)
plt.show()
下面開(kāi)始建模:
#導(dǎo)入邏輯回歸進(jìn)行建模分類
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
#對(duì)數(shù)據(jù)集進(jìn)行分組莉炉,80%的圖片作為訓(xùn)練集钓账,20%的數(shù)據(jù)作為測(cè)試集
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=1)
logreg = LogisticRegression(random_state=1).fit(X_train,y_train)
print(logreg)
#打印模型在訓(xùn)練數(shù)據(jù)集上的準(zhǔn)確率
print("accuracy:",accuracy_score(logreg.predict(X_train),y_train))
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
intercept_scaling=1, max_iter=100, multi_class='warn',
n_jobs=None, penalty='l2', random_state=1, solver='warn',
tol=0.0001, verbose=0, warm_start=False)
accuracy: 1.0
可以看到,在訓(xùn)練數(shù)據(jù)集上的準(zhǔn)確率是1,100%準(zhǔn)確絮宁。那么梆暮,在測(cè)試集上的表現(xiàn)是怎么樣的呢?
y_pred = logreg.predict(X_test)
print("accuracy:",accuracy_score(y_pred,y_test))
accuracy: 0.8255813953488372
在測(cè)試集上的分類準(zhǔn)確率是82%绍昂,好像還不算太差~
我們進(jìn)一步看看在各個(gè)類別上的正確率啦粹,召回率以及F1值:
from sklearn.metrics import classification_report
print(classification_report(y_test,y_pred))
今天我們用邏輯回歸在7類別的圖片進(jìn)行了分類,小試牛刀~ 后面治专,我會(huì)陸續(xù)介紹決策樹(shù)卖陵,集成學(xué)習(xí)(隨機(jī)森林,adboost)等模型以及模型的評(píng)價(jià)參數(shù)张峰。