一.使用PCA識別手寫數(shù)字
PCA:Principal Component Analysis(主成分分析)
PCA通過線性變換將原始數(shù)據(jù)變換為一組各維度線性無關(guān)的表示,可用于提取數(shù)據(jù)的主要特征分量,常用于高維數(shù)據(jù)的降維
圖1.png
圖2.png
1.導(dǎo)包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.decomposition import PCA
from sklearn.svm import SVC
%matplotlib inline
2.加載數(shù)據(jù)
data = pd.read_csv('./train.csv')
data.shape
3.處理數(shù)據(jù)獲取訓(xùn)練數(shù)據(jù)和測試數(shù)據(jù)
數(shù)據(jù)共有785列,第一列為label,剩下的784列數(shù)據(jù)存儲的是灰度圖像(0~255)的像素值 28*28=784
#手跡像素信息
images = data.iloc[:,1:].values
#標(biāo)簽信息
target = data.iloc[:,:1].values.reshape(-1)
train_num = 5000
test_num = 7000
X_train,X_test = images[:train_num],images[:-test_num]
y_train,y_test = target[:train_num],target[:-test_num]
4.使用PCA進(jìn)行降維
使用PCA對測試數(shù)據(jù)進(jìn)行降維
pca = PCA(n_components=0.8,whiten=True)
#設(shè)置PCA參數(shù)
#n_components:
#設(shè)為大于零的整數(shù),會自動的選取n個主成分,
#設(shè)為分?jǐn)?shù)時,選擇特征值占總特征值大于n的,作為主成分
#whiten:
#True表示做白化處理,白化處理主要是為了使處理后的數(shù)據(jù)方差都一致
pca = PCA(n_components= 0.8,whiten = True)
pca.fit(images)
X_train_pca = pca.transform(X_train)
X_test_pca = pca.transform(X_test)
5.創(chuàng)建機器學(xué)習(xí)模型
svc = SVC(kernel='rbf')
svc.fit(X_train_pca,y_train)
y_svc = svc.predict(y_test)
#預(yù)測數(shù)據(jù)
#對手跡進(jìn)行識別識別
svc.score(X_test_pca,y_test)
6.預(yù)測數(shù)據(jù)繪制圖形
#繪制50個數(shù)據(jù)
plt.figure(figsize = (1.8*10,2.5*5))
for i in range(50):
plt.subplot(5,10,i+1)
plt.imshow(X_test[i].reshape(28,28))
plt.axis('off')
plt.title('trainig: '+str(y_test[i])+'\n'+'predict: '+str(y_svc[i]))
plt.show()

二.人臉識別
GridSearchCV:用于系統(tǒng)地遍歷多種參數(shù)組合,通過交叉驗證確定最佳效果參數(shù):
GridSearchCV,它存在的意義就是自動調(diào)參,只要把參數(shù)輸進(jìn)去,就能給出最優(yōu)化的結(jié)果和參數(shù)。但是這個方法適合于小數(shù)據(jù)集,一旦數(shù)據(jù)的量級上去了,很難得出結(jié)果。這個時候就是需要動腦筋了。數(shù)據(jù)量比較大的時候可以使用一個快速調(diào)優(yōu)的方法——坐標(biāo)下降。它其實是一種貪心算法:拿當(dāng)前對模型影響最大的參數(shù)調(diào)優(yōu),直到最優(yōu)化;再拿下一個影響最大的參數(shù)調(diào)優(yōu),如此下去,直到所有的參數(shù)調(diào)整完畢。這個方法的缺點就是可能會調(diào)到局部最優(yōu)而不是全局最優(yōu),但是省時間省力,巨大的優(yōu)勢面前,還是試一試吧,后續(xù)可以再拿bagging再優(yōu)化?;氐絪klearn里面的GridSearchCV,GridSearchCV用于系統(tǒng)地遍歷多種參數(shù)組合,通過交叉驗證確定最佳效果參數(shù)
SVM的兩個參數(shù) C 和 gamma:
C是懲罰系數(shù),即對誤差的寬容度。c越高,說明越不能容忍出現(xiàn)誤差,容易過擬合。C越小,容易欠擬合。C過大或過小,泛化能力變差;
gamma是選擇RBF函數(shù)作為kernel后,該函數(shù)自帶的一個參數(shù)。隱含地決定了數(shù)據(jù)映射到新的特征空間后的分布,gamma越大,支持向量越少,gamma值越小,支持向量越多。支持向量的個數(shù)影響訓(xùn)練與預(yù)測的速度
1.導(dǎo)包
import matplotlib.pyplot as plt
import logging
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
#Labeled Faces in the Wild Home 標(biāo)記的面孔數(shù)據(jù)
from sklearn.datasets import fetch_lfw_people
from sklearn.decomposition import PCA
from sklearn.svm import SVC
import numpy as np
2.設(shè)置log日志輸出,顯示程序執(zhí)行的進(jìn)度
# 控制臺輸出記錄數(shù)據(jù),顯示程序處理數(shù)據(jù)的進(jìn)度
logging.basicConfig(level=logging.INFO, format='%(asctime)s %(message)s')
3.加載人臉數(shù)據(jù)
#############################################################################
# 獲取數(shù)據(jù),如果沒有人臉的數(shù)據(jù),那么從網(wǎng)絡(luò)上進(jìn)行下載,如果本地磁盤有,那么從本地進(jìn)行加載
lfw_people = fetch_lfw_people(min_faces_per_person=70, resize=0.4)
4.記錄圖像數(shù)組的維度
# 查看圖像數(shù)據(jù)的數(shù)組結(jié)構(gòu)(繪圖)
n_samples, h, w = lfw_people.images.shape
5.從加載的數(shù)據(jù)中獲取機器學(xué)習(xí)的訓(xùn)練數(shù)據(jù)
# 對于機器學(xué)習(xí),我們直接使用2個數(shù)據(jù)(由于該模型忽略了相對像素位置信息)
X = lfw_people.data
# 目標(biāo)人物的標(biāo)簽
y = lfw_people.target
#目標(biāo)人物的名字
target_names = lfw_people.target_names
6.處理數(shù)據(jù)得到訓(xùn)練數(shù)據(jù)和測試數(shù)據(jù)
#############################################################################
#分割訓(xùn)練數(shù)據(jù)和預(yù)測數(shù)據(jù)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.25, random_state=42)
7.數(shù)據(jù)的維度太高使用pca進(jìn)行降維
#############################################################################
# 使用PCA對數(shù)據(jù)進(jìn)行降維,去除一些不重要的數(shù)據(jù),之前的維度是1850,我們降維到150
n_components = 150
#創(chuàng)建pca并訓(xùn)練數(shù)據(jù)
pca = PCA(n_components=n_components, svd_solver='randomized',
whiten=True).fit(X_train)
X_train_pca = pca.transform(X_train)
X_test_pca = pca.transform(X_test)
8.通過pca算法,我們可以從總體數(shù)據(jù)中抽取特征面部
#150張最具特張的臉部數(shù)據(jù)
eigenfaces = pca.components_.reshape((n_components, h, w))
9.運用GridSearchCV獲取最佳的機器學(xué)習(xí)方法
#############################################################################
# 創(chuàng)建機器學(xué)習(xí)模型
c = np.arange(1,10,2)
param_grid = {'C': c,
'gamma': [0.0001, 0.0005, 0.001, 0.005, 0.01, 0.1], }
clf = GridSearchCV(SVC(kernel='rbf', class_weight='balanced'), param_grid)
clf = clf.fit(X_train_pca, y_train)
#通過GridSearchCV我們找到了最佳的支持向量機方法
print('最佳的支持向量機參數(shù)',clf.best_estimator_)
10.定義方法人臉對應(yīng)人名,預(yù)測姓名,真實姓名
# 預(yù)測名字和真實名字
def title(y_pred, y_test, target_names, i):
pred_name = target_names[y_pred[i]].rsplit(' ', 1)[-1]
true_name = target_names[y_test[i]].rsplit(' ', 1)[-1]
return 'predicted: %s\ntrue: %s' % (pred_name, true_name)
11.定義繪制圖形方法
#y_test是圖片數(shù)據(jù)
#row代表多少行,columns代表多少列
def draw_picture(X_test,row,columns,titles):
plt.figure(figsize=(columns*2,row*2.8))
for i in range(row*columns):
plt.subplot(row,columns,(i+1))
plt.imshow(X_test[i].reshape((250,250)),cmap = 'gray')
plt.title(titles[i])
plt.axis('off')
12.調(diào)用方法,顯示人臉識別的預(yù)測結(jié)果
#調(diào)用方法獲取人臉預(yù)測的名字,以及人臉的真實名字
prediction_titles = [title(y_pred, y_test, target_names, i)
for i in range(y_pred.shape[0])]
#調(diào)用方法,進(jìn)行人臉繪制
plot_gallery(X_test, prediction_titles, h, w)
#顯示
plt.show()


三.特征工程

四.機器學(xué)習(xí)評價指標(biāo)
機器學(xué)習(xí)常見評價指標(biāo):
AUC
AUC是一個模型評價指標(biāo),用于二分類模型的評價。AUC是“Area under Curve(曲線下的面積)”的英文縮寫,而這條“Curve(曲線)”就是ROC曲線。
ROC:受試者工作特征曲線
ROC.png
然后,我們計算兩個指標(biāo)的值:
??接著,我們以“True Positive Rate”作為縱軸,以“False Positive Rate”作為橫軸,畫出ROC曲線。類似下圖:
??True Positive Rate=TP/(TP+FN),代表將真實正樣本劃分為正樣本的概率 真陽率
??False Positive Rate=FP/(FP+TN),代表將真實負(fù)樣本劃分為正樣本的概率 偽陽率
類似圖---ROC.png
為什么要用AUC作為二分類模型的評價指標(biāo)呢?為什么不直接通過計算準(zhǔn)確率來對模型進(jìn)行評價呢?答案是這樣的:機器學(xué)習(xí)中的很多模型對于分類問題的預(yù)測結(jié)果大多是概率,即屬于某個類別的概率,如果計算準(zhǔn)確率的話,就要把概率轉(zhuǎn)化為類別,這就需要設(shè)定一個閾值,概率大于某個閾值的屬于一類,概率小于某個閾值的屬于另一類,而閾值的設(shè)定直接影響了準(zhǔn)確率的計算。使用AUC可以解決這個問題,接下來詳細(xì)介紹AUC的計算。例如,數(shù)據(jù)集一共有5個樣本,真實類別為(1,0,0,1,0);二分類機器學(xué)習(xí)模型,得到的預(yù)測結(jié)果為(0.5,0.6,0.4,0.7,0.3)。將預(yù)測結(jié)果轉(zhuǎn)化為類別——預(yù)測結(jié)果降序排列,以每個預(yù)測值(概率值)作為閾值,即可得到類別。計算每個閾值下的“True Positive Rate”、“False Positive Rate”。以“True Positive Rate”作為縱軸,以“False Positive Rate”作為橫軸,畫出ROC曲線,ROC曲線下的面積,即為AUC的值。
首先,我們看如下的圖示:
那么什么是“True Positive Rate”、“False Positive Rate”?
ROC1.png
然后,我們計算兩個指標(biāo)的值:
??TruePositiveRate=TP/(TP+FN),代表將真實正樣本劃分為正樣本的概率
??FalsePositiveRate=FP/(FP+TN),代表將真實負(fù)樣本劃分為正樣本的概率
??接著,我們以“True Positive Rate”作為縱軸,以“False Positive Rate”作為橫軸,畫出ROC曲線,ROC曲線下的面積,即為AUC的值。類似下圖:
類似圖---ROC1.png
Precision、Recall、F-measure、Accuracy
Precision------"正確被檢索的item(TP)"占所有"實際被檢索到的(TP+FP)"的比例
Recall------“正確被檢索的item(TP)"占所有"應(yīng)該檢索到的item(TP+FN)"的比例
F-measure= 正確率 * 召回率 * 2 / (正確率 + 召回率) (F 值即為正確率和召回率的調(diào)和平均值)
1.png
2.png
五.ROC-AUC圖形繪制
1.導(dǎo)包
import numpy as np
#線性插值
from scipy import interp
import matplotlib.pyplot as plt
%matplotlib inline
from sklearn import svm, datasets
# 評價指標(biāo)
from sklearn.metrics import roc_curve, auc
# 數(shù)據(jù)拆分,分層采樣,確保訓(xùn)練集,測試集中各類別樣本的比例與原始數(shù)據(jù)集中相同
from sklearn.model_selection import StratifiedKFold
2.加載數(shù)據(jù)iris并添加噪聲
iris = datasets.load_iris()
X = iris.data
y = iris.target
X, y = X[y != 2], y[y != 2]
n_samples, n_features = X.shape
# Add noisy features
random_state = np.random.RandomState(0)
X = np.c_[X, random_state.randn(n_samples, 200 * n_features)]
3.聲明算法
cv = StratifiedKFold(n_splits=6)
classifier = svm.SVC(kernel='linear', probability=True,random_state=random_state)
tprs = []
aucs = []
mean_fpr = np.linspace(0, 1, 100)
4.批量訓(xùn)練計算ROC
i = 0
for train, test in cv.split(X, y):
probas_ = classifier.fit(X[train], y[train]).predict_proba(X[test])
y_ = classifier.predict(X[test])
# Compute ROC curve and area the curve
fpr, tpr, thresholds = roc_curve(y[test], probas_[:, 1])
tprs.append(interp(mean_fpr, fpr, tpr))
tprs[-1][0] = 0.0
roc_auc = auc(fpr, tpr)
aucs.append(roc_auc)
plt.plot(fpr, tpr, lw=1, alpha=0.3,
label='ROC fold %d (AUC = %0.2f)' % (i, roc_auc))
i += 1
5.計算平均ROC
mean_tpr = np.mean(tprs, axis=0)
mean_tpr[-1] = 1.0
mean_auc = auc(mean_fpr, mean_tpr)
std_auc = np.std(aucs)
plt.plot(mean_fpr, mean_tpr, color='b',
label=r'Mean ROC (AUC = %0.2f $\pm$ %0.2f)' % (mean_auc, std_auc),
lw=2, alpha=.8)
6.設(shè)置繪圖
plt.xlim([-0.05, 1.05])
plt.ylim([-0.05, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver operating characteristic example')
plt.legend(loc="lower right")
plt.show()








