不支持深度學習和強化學習
numpy介紹:
np.eye(n)生成一個n維單元數組
數據預處理:
iris數據加載
from sklearn import datasets |
數據展示
顯示iris的信息
print(iris.data) |
[[5.1 3.5 1.4 0.2] [4.9 3. 1.4 0.2] [4.7 3.2 1.3 0.2] …… [5. 3.6 1.4 0.2] [5.4 3.9 1.7 0.4] [4.6 3.4 1.4 0.3]] |
每列數據表示不同樣本同一屬性下對用的數值
print(iris.feature_names) |
['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)'] |
輸出目標結果
print(iris.target) |
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2] |
結果的含義
print(iris.target_names) |
['setosa' 'versicolor' 'virginica'] |
確認數據類型
print(type(iris.data)) |
<class 'numpy.ndarray'> <class 'numpy.ndarray'> |
確認維度
print(iris.data.shape) print(iris.target.shape) |
(150, 4) (150,) |
X輸入數據賦值,y輸出數據賦值
X = iris.data |
模型訓練:
分類:根據數據集目標的特征或屬性,划分到已有的類別中
常用分類算法:KNN(K近鄰)、邏輯回歸、決策樹、朴素貝葉斯
KNN(最簡單的機器學習算法之一):
給定一個訓練數據集,對新的輸入實例,在訓練數據集中找到與該實例最鄰近的l個實例,這k個實例多數是什么類型就將該輸入實例分類到這個類中
模型調用
from sklearn.neighbors import KNeighborsClassifier |
創建實例
knn=KNeighborsClassifier(n_neighbors=5) |
模型訓練
模型訓練與預測
y_pred=knn.fit(X,y) |
准確率
from sklearn.metrics import accuracy_score |
數據分離
from sklearn.model_selection import train_test_split #訓練輸入數據,預測的輸入數據,訓練結果,預測結果 |
分離后數據集的訓練與評估
knn_5_s = KNeighborsClassifier(n_neighbors=5) |
確定k值
k_range=list(range(1,26)) score_train=[] |
圖形展示
import matplotlib.pyplot as plt %matplotlib inline #展示k值與訓練數據集預測准確率之間的關系 plt.plot(k_range,score_test) plt.xlabel('K(KNN model)') plt.ylabel('Training Accuracy') |
- 訓練數據集准確率 隨着模型復雜而提高
- 測試數據集准確率 在模型過於簡單或復雜而准確率更低
- KNN模型中,模型復雜度由K決定,(k越小,復雜度越高)
對新數據進行預測
knn_11=KNeighborsClassifier(n_neighbors=11) |
邏輯回歸模型:
用於解決分類問題的一種模型。根據數據特征或屬性,計算其歸屬於每一類別的概率P(x),根據概率數值判斷其所屬類別。主要應用場景:二分類問題。
P(x)=1/(1+e-(ax+b)) y={1, P(x)≥0.5 0,P(x)<0.5
其中y為類別結果,P為概率,x為特征值,a、b為常量
(皮馬印第安人糖尿病數據集)
輸入變量:獨立變量包括患者的懷孕次數,葡萄糖量,血壓,皮褶厚度,體重指數,胰島素水平,糖尿病譜系功能,年齡
輸出結果:是否含義糖尿病
數據來源:Pima Indians Dianbetes dataset
預測准確率的局限性:
無法真實反映模型針對各個分類的預測准確度
准確率可以方便的用於衡量模型的整體預測效果,但無法反應細節信息,具體表現:
- 沒有體現數據的實際分布情況
- 沒有體現模型錯誤預測的類型
空准確率:當模型總是預測比例較高的類別,其預測准確率的數值
混淆矩陣(誤差矩陣):
用於衡量分類算法的准確程度
- True Positives(TP):預測准確、實際為正樣本的數量(實際為1,預測為1)
- True Negatives(TN):預測准確、實際為負樣本的數量(實際為0,預測為0)
- False Positives(FP):預測錯誤、實際為負樣本的數量(實際為0,預測為1)
- False Negatives(FN):預測錯誤、實際為正樣本的數量(實際為1,預測為0)
公式 | 定義 | |
准確率 (Accuracy) |
|
整體樣本中,預測正確的比例 |
錯誤率 (Misclassification Rate) |
|
整體樣本中,預測錯誤的比例 |
召回率 (Recall) |
![]() |
正樣本中,預測正確的比例 |
特異度 (Specificity) |
![]() |
負樣本中,預測正確的比例 |
精確率 (Precision) |
![]() |
預測結果為正樣本中,預測正確的比例 |
F1分數 (F1 Score) |
![]() |
綜合Precision和Recall的判斷指標 |
混淆矩陣指標特點:
- 分類任務中,相比單一的預測准確率,混淆矩陣提供了更全面的模型評估信息
- 通過混淆矩陣,我們可以計算出多樣性的模型表現衡量指標,從而更好地選擇模型
哪個衡量指標更關鍵?
- 衡量指標的選擇取決於應用場景
- 垃圾郵件檢測(正樣本判斷為“垃圾郵件”):希望普通郵件(負樣本)不要被判斷為垃圾郵件(正樣本),需要關注精確率和召回率
- 異常交易檢測(正樣本為“異常交易”):希望所有的異常交易都被檢測到,需要關注特異度
#數據預處理 import pandas as pd path='csv文件路徑/xxx.csv' pima=pd.read_csv(path) #X,y賦值 feature_names=['pregnant','insulin','bmi','age'] X=pima[feature_names] y=pima.label #維度確認 print(X.shape,y.shape) #數據分離 from sklearn.model_selection import train_test_split X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=0) #模型訓練 from sklearn.linear_model import LogisticRegression logreg=LogisticRegression() logreg.fit(X_train,y_train) #測試數據集結果預測 y_pred=logreg.predict(X_test) #使用准確率進行評估 from sklearn import metrics print(metrics.accuracy_score(y_test,y_pred)) #確認正負樣本數據量 y_test.value_counts() #1的比例 y_test.mean() #0的比例 1-y_test.mean() #空准確率 max(y_test.mean(),1-y_test.mean()) |
#四個因子賦值 cofusion=metrics.confusion_matrix(y_test,y_pred) TN=confusion[0,0] FP=confusion[0,1] FN=confusion[1,0] TP=confusion[1,1] print(TN,FP,FN,TP) /*指標計算參見上面的公式*/ |