基於sklearn的一些AI算法基本操作
sklearn中的一些相關的庫
分別導入這些相關算法的庫
import pandas as pd #導入一個用於讀取csv數據的容器
from sklearn.model_selection import train_test_split #用於數據集划分的模塊
from sklearn.model_selection import GridSearchCV #用於交叉驗證的模塊
from sklearn.neighbors import KNeighborsClassifier #knn算法的模塊
from sklearn.linear_model import LinearRegression #線性回歸算法的模塊
from sklearn.linear_model import LogisticRegression #邏輯回歸算法模塊
from sklearn.svm import SVC #SVC算法的模塊
import matplotlib.pyplot as plt #可視化的繪圖模塊
import warnings #此處是用於忽視警告的模塊,warnings.filterwarnings("ignore")語句忽視警告
from sklearn.preprocessing import OneHotEncoder, MinMaxScaler #特征預處理處理模塊
import numpy as np
from sklearn.preprocessing import OneHotEncoder, MinMaxScaler #特征預處理模塊,one-hot編碼和均一化處理
基本思路;
定義特征和目標的標簽 -> 讀取整個數據集 -> 分別讀取特征與標簽數據集XY -> 划分數據集(測試集、訓練集) -> 聲明算法模型 -> 訓練、測試計算精確度
定義特征和目標的列
fruit_label = { 'apple': 0,'mandarin': 1,'orange': 2,'lemon': 3} #用一個字典表示水果標簽的映射關系,有監督的分類中需要用到
feature_data=['mass','width','height','color_score'] #用一個序列說明特征含有這幾種
讀取整個數據集
data_fruit=pd.read_csv(文件路徑) #讀取整個csv文件中的數據
映射生成標簽列(原來的結果標簽是文字,生成一個數字的)(有監督的分類KNN需要)
data_fruit['Label']=data_fruit['fruit_name'].map(fruit_label)
#生成了一個新的標簽列,列名是Lable,數據是根據fruit_name列數據生成的0-3的數據(0-3在上面定義了的)
#也就有監督的分類中需要用到,有監督的預測貌似不用誒...
分別讀取數據集中的特征和標簽
X=data_fruit[feature_data].values #讀取了之前定義的特征序列中的列,作為X數組
y=data_fruit['Label'].values #讀取標簽列中數據作為Y數組
#data[key] 類型是pandas的series 類型的數據;而data[key].values 類型是numpy 的ndarray類型的數據
划分數據集(訓練集、測試集)
#將整個數據集划分為4個部分特征的訓練集、測試集,結果標簽的訓練集、測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1 / 3, random_state=10)
#上述語句表示對X,y進行划分,其中測試集占整體數據的1/3,並且隨機划分(防止原先數據有序排放使得某些標簽數據沒有得到訓練)
train_data, test_data= train_test_split(data, test_size=1 / 3, shuffle=False)
#上述語句表示對整個數據集划分,並且不要亂序,有些模型當中不能亂序,且沒有標簽
聲明算法模型、訓練、計算准確度
KNN算法的聲明、訓練、精度計算
knn_model=KNeighborsClassifier()
knn_model.fit(X_train,y_train) #對訓練集進行訓練
accuracy=knn_model.score(X_test,y_test) #對測試集進行測試計算精度
線性回歸算法的聲明、訓練、精度計算
linear_reg_model = LinearRegression()
linear_reg_model.fit(X_train, y_train)
r2_score = linear_reg_model.score(X_test, y_test)
#單個樣本的取值;X_test[i, :]表示測試集中i行的全部數據
邏輯回歸算法的聲明、訓練、精度計算
LogisticRegression_model=LogisticRegression()
LogisticRegression_model.fit(X_train, y_train)
r2_score =LogisticRegression_model.score(X_test, y_test)
SVM算法的聲明、訓練、精度計算
SVM_model=SVC()
SVM_model.fit(X_train, y_train)
accuracy= SVM_model.score(X_test, y_test)
尋找最優超參數(KNN中的K,logistics回歸中的C,SVM中的C)
KNN中的K確定的思路一:
定義一個K序列,放入想要測試的一些K的值,然后遍歷K,重復進行上述基本操作(讀取數據集中的特征標簽、划分數據集、訓練與測試)
k_sets=[3,5,8]
for k_set in k_sets:
round_function(fruit_data,k_set)#這邊需要fruit_data,所以定義這個函數要傳入fruit_data參數
def round_function(fruit_data,k_set):
X=fruit_data[feature_data].values
y=fruit_data['Label'].values
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=1 / 3, random_state=10)
knn_model=KNeighborsClassifier(n_neighbors=k_set)#再傳入參數K進行驗證,默認是5
knn_model.fit(X_train,y_train)
accuracy=knn_model.score(X_test,y_test)
print('K為{}時候的精確度為{:.2f}%'.format(k_set,accuracy*100))
交叉驗證(舉個網格搜索)
交叉驗證:在調參試驗(確定最優超參數的試驗)中,在訓練集中分割成N個部分,依次將N個部分的每個部分都作為測試集進行一次試驗,然后計算每次的准確度,最后求着N個准確度的均值。N表示折數(fold)
對於有多個超參數需要確定的叫做網格搜索,sklearn中使用GridSearchCV()特征處理,比如說下述案例需要調試kNN中的k與p兩個參數
步驟:定義需要驗證的字典-->遍歷測試打印精確度
model_dict={
'KNN': (KNeighborsClassifier(),{'n_neighbors':[3,5,7],'p':[1,2]}),
'Logistic':(LogisticRegression(),{'C':[1e-2,1,1e2]}),
'SVM':(SVC(),{'C':[1e-2,1,1e2] })
}
#遍歷比較
for model_name,(model,model_param) in model_dict.items():
#訓練模型,選出最好的參數
clf=GridSearchCV(estimator=model, param_grid=model_param, cv=5) #放入算法模型、需要確定的參數、設置為5折交叉驗證
clf.fit(X_train,y_train)
best_model=clf.best_estimator_
#計算精確度
acc=best_model.score(X_test,y_test)
#打印比較
print('{}的最好參數是{}准確度為{:.2f}%'.format(model_name,best_model,acc*100))
尋找最優算法
定義好一個算法字典,進行遍歷
#定義好一個算法字典,將算法名和模型對應好
model_dict={'KNN': KNeighborsClassifier(n_neighbors=7), 'Logistic':LogisticRegression(C=1), 'SVM':SVC(C=1) }
#遍歷比較
for model_name,model in model_dict.items():
#訓練模型
model.fit(X_train,y_train)
#計算精確度
acc=model.score(X_test,y_test)
#打印比較
print('{}的准確度為{:.2f}%'.format(model_name,acc*100))
注意
items()就是字典遍歷的時候用的,取出對應的健與值
可視化繪圖
調用matplotlib繪圖模塊,定義一個繪圖的方法,繪圖基本過程線:先創建一個圖形實例(plt.figure())-->繪圖-->展示(plt.show())
def plot_fitting_line(linear_reg_model, X, y, feat):
"""
繪制線型回歸線
"""
w = linear_reg_model.coef_ #使用coef_獲得權重
b = linear_reg_model.intercept_ # .intercept_ 獲得偏置項
plt.figure()#創建一個圖形實例,相當於一個畫布
# 真實值的散點圖
plt.scatter(X, y, alpha=0.5) #繪制基於X軸(特征)的真實值的散點圖,透明度為50%
# 直線
plt.plot(X, w * X + b, c='red')#繪制基於x軸(特征)的預測值的直線圖,紅線繪制
plt.title(標題) #圖像的標題
plt.show() #顯示圖像
繪圖傳入X,Y軸以及其他的一些限定參數
注意
需要用到什么樣的就傳入什么樣的參數,上面傳入的參數均為
特征預處理
特征可以分成:數字型特征、有序型特征、類型特征(性別之類的),對於數字型特征可以進行歸一化處理、對於類型特征可以進行one-hot編碼
步驟:聲明特征種類-->進行預處理-->處理完成后主函數中用處理后的特征訓練檢驗
# 使用的特征列
NUM_FEAT_COLS = ['AGE','BMI', 'BP', 'S1', 'S2','S3','S4','S5','S6']#數字型特征
CAT_FEAT_COLS=[ 'SEX']#類別型特征
#定義預處理方法,傳入訓練集和特征集的特征
def process_features(X_train, X_test):
# 1. 對類別型特征做one-hot encoding
encoder = OneHotEncoder(sparse=False)
encoded_tr_feat = encoder.fit_transform(X_train[CAT_FEAT_COLS])
encoded_te_feat = encoder.transform(X_test[CAT_FEAT_COLS])
#因為這邊需要通過列的名稱取到特征數據,所以主函數中划分X,y時不加.values,這也不加因為這里是numpy。然后訓練集特征與測試集特征處理函數是不同的
# 2. 對數值型特征值做歸一化處理
scaler = MinMaxScaler()
scaled_tr_feat = scaler.fit_transform(X_train[NUM_FEAT_COLS])
scaled_te_feat = scaler.transform(X_test[NUM_FEAT_COLS])
# 3. 特征合並
X_train_proc = np.hstack((encoded_tr_feat, scaled_tr_feat))
X_test_proc = np.hstack((encoded_te_feat, scaled_te_feat))
return X_train_proc, X_test_proc
附上一張神圖

