天天看點

尋找最優模型---K折交叉驗證1.概覽2.代碼

目錄

1.概覽

2.代碼

1.概覽

當我們要從多個模型中快速選擇一個較為合适的模型時,也可以把資料依次放到每個模型中去測試,找到泛化能力較強的那一個。雖然這是一個「笨」辦法,但在實驗流程上也有一些取巧的步驟。其中之一,就是今天要介紹的 K 折交叉驗證(k-fold cross-validation)。

其通過将資料集均分成 K 個子集,并依次将其中的 K-1 個子集作為訓練集,剩下的 1 個子集用作測試集。在 K 折交叉驗證的過程中,每個子集均會被驗證一次。

尋找最優模型---K折交叉驗證1.概覽2.代碼

2.代碼

# -*- coding: utf-8 -*-
"""
Created on Thu Sep  6 19:54:24 2018

k折交叉驗證
   資料:(鮑魚)年齡資料集 challenge-6-abalone.csv
   http://labfile.oss.aliyuncs.com/courses/1081/challenge-6-abalone.csv
     資料說明:最後 1 列為目标列,統計了鮑魚的環數(Rings),環數從 1-30 變化,值越大代表鮑魚的年齡越大。
    
    
  方法:
      1.批量替換df.replace()    指定替換值
         df.Sex.replace({'M':0,'F':1,'I':2})
      2.剪切函數    pd.cut(data,bins=[元素箱子],labels=[轉成的标簽])    這個data裡的資料必須是數值型    
          可用于從連續變量到分類變量。
         pd.cut(df.Rings,bins=[0,10,20,30],labels=['small','middle','large'])
      3.dataframe格式
        1.擷取元素,先用data.index[1]擷取行号,然後再用pd.iloc[行号]執行操作
          df.iloc[df.index[-1]].values
        2.直接通過pd.iloc[:,:]擷取目标資料
      4.拼接dataframe資料
         pd.dataframe(data1,columns=columns_value).append(data2,ignore_index=True)
      5.資料類型轉換
        字元串轉換數值
        pd.to_numeric(data)
      6.dataframe格式資料,重新設定column會自動覆寫原來的column
"""
#加載資料集
import pandas as pd
df=pd.read_csv('challenge-6-abalone.csv')
"""資料預處理
1.重新确認column
2.連續型字段轉換為類别字段
3.字段替換
"""
#資料最後一行是字段名,對資料進行整改,如何拼接dataframe
columns_name = df.iloc[df.index[-1]].values#通過df.index[-1]擷取索引行号,然後用df.iloc[]來過濾
new_line = df.columns.values
df = df.drop(df.index[-1])
df.columns = columns_name
df = pd.DataFrame([new_line], columns=columns_name).append(df, ignore_index=True)
#本次實驗将 1-10 環定義為 small(小鮑魚), 11-20 環定為 middle(中型鮑魚), 21-30 定為 large(老鮑魚)。
#Sex 列出現的 3 個性别種類 M, F, I,我們分别使用數值 0,1,2 進行替換。
#按區間替換是可使用 pd.cut()
df['Rings']=pd.to_numeric(df['Rings'])#将字元串型字段轉換為數值型
df['Rings']=pd.cut(df.Rings,bins=[0,10,20,30],labels=['small','middle','large'])
df['Sex']=df.Sex.replace({'M':0,'F':1,'I':2})#批量替換


#print(df.head())
""" k折子集均分
預處理之後的資料集平均劃分為 K 個子集
結果需要周遊才能擷取具體資料
"""
from sklearn.model_selection import KFold
kf=KFold(n_splits=10,shuffle=False,random_state=50)
for train_index,test_index in kf.split(df):
    print('train',len(train_index),'test',len(test_index))
"""k折交叉驗證
使用k近鄰模型建構學習分類模型,并進行10折交叉驗證
"""

from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import cross_val_score
features=df.iloc[:,0:8]
target=df['Rings']
model=KNeighborsClassifier()
print(cross_val_score(model,X=features,y=target,cv=10))

"""各分類模型 10 折交叉驗證函數

使用 10 折交叉驗證方法測試鮑魚資料集在邏輯回歸、K 近鄰、
支援向量機、人工神經網絡、決策樹、随機森林、Adaboost 預設參數下的表現結果,
并取 10 折交叉驗證結果取平均值。
"""
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC
from sklearn.neural_network import MLPClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import AdaBoostClassifier
def classifier():
    scores=[]
    models=[LogisticRegression(),KNeighborsClassifier(),SVC(),MLPClassifier(),DecisionTreeClassifier(),RandomForestClassifier(),AdaBoostClassifier()]
    for model in models:
        score=cross_val_score(model,X=features,y=target,cv=10)
        mean_score=np.mean(score)
        scores.append(mean_score)
    return scores
a=classifier()
print('aaa',a)
import  matplotlib.pyplot as plt
plt.plot([i for i in range(len(a))],a)
           

 結果圖:

尋找最優模型---K折交叉驗證1.概覽2.代碼

你會發現,當我們使用預設參數時,7 種分類預測模型的表現都還不錯,其中支援向量機、人工神經網絡、随機森林等表現突出。此時,我們就可以先初選出這幾種方法,然後通過調參得到更理想的結果。

繼續閱讀