基於sklearn進行線性回歸、logistic回歸、svm等的簡單操作總結


基於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

附上一張神圖


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM