1. 程式人生 > >【尋優演算法】交叉驗證(Cross Validation)引數尋優的python實現:多引數尋優

【尋優演算法】交叉驗證(Cross Validation)引數尋優的python實現:多引數尋優

【尋優演算法】交叉驗證(Cross Validation)引數尋優的python實現:多引數尋優


交叉驗證的基礎知識可參考 上一篇博文,本博文主要介紹使用交叉驗證進行多引數尋優時的引數搜尋方法:網格搜尋(Grid Search)以及網格搜尋兩種常用的python實現方式。

一、網格搜尋原理

網格搜尋是一種窮舉搜尋方法,通過迴圈遍歷多引數的可能取值情況,效能最好的模型對應的引數就是最優引數。

二、網格搜尋+交叉驗證用於多引數尋優的python實現

程式碼及樣本地址: https://github.com/shiluqiang/python_GridSearch-CV

1、訓練模型及待尋優引數

本博文選用的多引數機器學習模型為非線性SVM(參考資料【1】),模型的優化問題為:

min
W , e
1

2 W 2 + C 2 i = 1 m e i 2 s . t . y i ( W φ ( x i ) + b ) 1 e i , i = 1 ,   , m e 0 , i = 1 ,   , m \begin{array}{l} \mathop {\min }\limits_{W,e} \frac{1}{2}{\left\| W \right\|^2} + \frac{C}{2}\sum\limits_{i = 1}^m {{e_i}^2} \\ s.t.{y_i}\left( {W \cdot \varphi ({x_i}) + b} \right) \ge 1 - {e_i},i = 1, \cdots ,m\\ e \ge 0,i = 1, \cdots ,m \end{array}

通過Lagrange乘數法並轉化為對偶問題,優化問題轉換為:

min α 1 2 i m j m α i α j y i y j K ( x i , x j ) i = 1 m α i s . t . i = 1 m α i y i = 0 0 α i C , i = 1 ,   , m \begin{array}{l} \mathop {\min }\limits_\alpha \frac{1}{2}\sum\limits_i^m {\sum\limits_j^m {{\alpha _i}{\alpha _j}{y^i}{y^j}K\left( {{x_i},{x_j}} \right) - \sum\limits_{i = 1}^m {{\alpha _i}} } } \\ s.t.\sum\limits_{i = 1}^m {{\alpha _i}{y^i} = 0} \\ 0 \le {\alpha _i} \le C,i = 1, \cdots ,m \end{array}

其中: K ( x i , x j ) = exp ( x i x j 2 2 σ 2 ) K\left( {{x_i},{x_j}} \right) = \exp \left( { - \frac{{{{\left\| {{x_i} - {x_j}} \right\|}^2}}}{{2{\sigma ^2}}}} \right)

非線性SVM有兩個引數:正則化引數 C C 和核引數 σ \sigma

2、直接迴圈巢狀實現網格搜尋 + cross_validation

import numpy as np
from sklearn import svm
from sklearn import cross_validation
from sklearn.model_selection import GridSearchCV

def load_data(data_file):
    '''匯入訓練資料
    input:  data_file(string):訓練資料所在檔案
    output: data(mat):訓練樣本的特徵
            label(mat):訓練樣本的標籤
    '''
    data = []
    label = []
    f = open(data_file)
    for line in f.readlines():
        lines = line.strip().split(' ')
        
        # 提取得出label
        label.append(float(lines[0]))
        # 提取出特徵,並將其放入到矩陣中
        index = 0
        tmp = []
        for i in range(1, len(lines)):
            li = lines[i].strip().split(":")
            if int(li[0]) - 1 == index:
                tmp.append(float(li[1]))
            else:
                while(int(li[0]) - 1 > index):
                    tmp.append(0)
                    index += 1
                tmp.append(float(li[1]))
            index += 1
        while len(tmp) < 13:
            tmp.append(0)
        data.append(tmp)
    f.close()
    return np.array(data), np.array(label).T

### 1.匯入資料集
trainX,trainY = load_data('heart_scale')

### 2.設定C和sigma的取值範圍
c_list = []
for i in range(1,50):
    c_list.append(i * 0.5)
    
gamma_list = []
for j in range(1,40):
    gamma_list.append(j * 0.2)
    
### 3.1迴圈巢狀實現網格搜尋 + 交叉驗證
best_value = 0.0

for i in c_list:
    for j in gamma_list:
        current_value = 0.0
        rbf_svm = svm.SVC(kernel = 'rbf', C = i, gamma = j)
        scores = cross_validation.cross_val_score(rbf_svm,trainX,trainY,cv =3,scoring = 'accuracy')
        current_value = scores.mean()
        if current_value >= best_value:
            best_value = current_value
            best_parameters = {'C': i, 'gamma': j}
        print('Best Value is :%f'%best_value)
        print('Best Parameters is',best_parameters)

3、GridSearchCV

import numpy as np
from sklearn import svm
from sklearn.model_selection import GridSearchCV

def load_data(data_file):
    '''匯入訓練資料
    input:  data_file(string):訓練資料所在檔案
    output: data(mat):訓練樣本的特徵
            label(mat):訓練樣本的標籤
    '''
    data = []
    label = []
    f = open(data_file)
    for line in f.readlines():
        lines = line.strip().split(' ')
        
        # 提取得出label
        label.append(float(lines[0]))
        # 提取出特徵,並將其放入到矩陣中
        index = 0
        tmp = []
        for i in range(1, len(lines)):
            li = lines[i].strip().split(
            
           

相關推薦

演算法交叉驗證Cross Validation引數python實現引數

【尋優演算法】交叉驗證(Cross Validation)引數尋優的python實現:多引數尋優 一、網格搜尋原理 二、網格搜尋+交叉驗證用於多引數尋優的python實現 1、訓練模型及待尋優引數 2、直接迴圈巢狀實現網格搜尋 + cros

演算法交叉驗證Cross Validation引數python實現單一引數

【尋優演算法】交叉驗證(Cross Validation)引數尋優的python實現:單一引數尋優 一、交叉驗證的意義 二、常用的交叉驗證方法 1、Hold one method 2、K-flod CV 3、Leave-One-Ou

機器學習交叉驗證cross-validation

1、什麼是交叉驗證  交叉驗證(Cross validation),交叉驗證用於防止模型過於複雜而引起的過擬合。有時亦稱迴圈估計, 是一種統計學上將資料樣本切割成較小子集的實用方法。於是可以先在一個子集上做分析, 而其它子集則用來做後續對此分析的確認及驗證。 一開始的子集被稱

交叉驗證Cross-validation

AI---訓練集(train set) 驗證集(validation set) 測試集(test set) 在有監督(supervise)的機器學習中,資料集常被分成2~3個即: 訓練集(train set) 驗證集(validation set) 測試集(test set

[轉載] 交叉驗證Cross Validation簡介

一、訓練集 vs. 測試集 在模式識別(pattern recognition)與機器學習(machine learning)的相關研究中,經常會將資料集(dataset)分為訓練集(training set)跟測試集(testing set)這兩個子集,前者用以建立

模型評估和超引數調整——交叉驗證 cross validation

讀《python machine learning》chapt 6 Learning Best Practices for Model Evaluation and Hyperparameter Tuning【主要內容】(1)獲得對模型評估的無偏估計(2)診斷機器學習演算法的

交叉驗證Cross Validation與網格搜尋Grid Search的原理及實證分析

1.交叉驗證背景在機器學習演算法中,當資料量不充分時,需要對資料進行重複使用,就出現了交叉驗證方法(Cross Validation),簡稱CV。交叉驗證顧名思義就是重複使用資料,把資料分為訓練集(Trading Set)、驗證集(Validation Set)、測試集(Te

Udacity機器學習入門——交叉驗證cross-validation

測試資料可以讓你評估你的分類器或迴歸在獨立資料集上的效能,還能幫助你避免過度擬合在sklearn中訓練/測試分離載入資料集以適應線性SVM:from sklearn import datasets from sklearn.svm import SVC iris = dat

sklearn中的交叉驗證Cross-Validation

這個repo 用來記錄一些python技巧、書籍、學習連結等,歡迎star sklearn是利用python進行機器學習中一個非常全面和好用的第三方庫,用過的都說好。今天主要記錄一下sklearn中關於交叉驗證的各種用法,主要是對sklearn官方文件

交叉驗證cross validation

        針對不同引數和結構的模型,他們的泛化能力我們為了評估無從可知,為了瞭解模型的泛化能力,我們引入了交叉驗證。所以我們在劃分資料集的時候,通常會將資料集劃分為三個資料集,三個資料集分別是:訓練集(train set),評估集(valid set)和測試集(test

斯坦福大學機器學習——交叉驗證Cross Validation

假設我們需要從某些候選模型中選擇最適合某個學習問題的模型,我們該如何選擇?以多元迴歸模型為例:,應該如何確定k的大小,使得該模型對解決相應的分類問題最為有效?如何在偏倚(bias)和方差(variance)之間尋求最佳的平衡點?更進一步,我們同樣需要知道如何在加權迴歸模型中

排序演算法氣泡排序Bubble Sort

一、簡介 氣泡排序(Bubble Sort)也是一種簡單直觀的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢“浮”到數列的頂端。 二、

高精度演算法A-B答案可負

#include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> cha

演算法尋找1000000000十億內素數並統計個數

已優化到 22 秒內,不知道世界最快演算法在同樣環境下執行速度是多少,下面貼出程式碼,C# using System; namespace prime { class Program { static void Main(string[]

聯絡二項分佈的對數似然函式與交叉cross entropy損失函式

1. 二項分佈 二項分佈也叫 0-1 分佈,如隨機變數 x 服從二項分佈,關於引數 μ(0≤μ≤1),其值取 1 和取 0 的概率如下: {p(x=1|μ)=μp(x=0|μ)=1−μ 則在 x

資料結構與演算法——連結串列Linked List

## 連結串列(Linked List)介紹 > 連結串列是有序的列表,但是它在記憶體中是儲存如下: > > ![](http://itfxsen.oss-cn-chengdu.aliyuncs.com/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%

JAVA設計模式外觀模式Facade Pattern

簡單 產生 creat ide oid dsm ref 功能 .net 一 定義 為子系統中的一組接口提供一個一致的界面。Facade模式定義了一個高層的接口,這個接口使得這一子系統更加easy使用。 二 案例 一個子系統中擁有3個模塊。每一個模塊

大話存儲學習筆記14章, 虛擬化.md

中斷向量 高速io app服務器 class 後來 image linux vfs 底層 操作系統對硬件的虛擬化 操作系統:就是為其他程序提供編寫和運行環境的程序。 由程序來運行程序,而不是程序自己來運行,這是操作系統提供的虛擬化的表現。 加電之後,首先運行OS,隨時可

大話存儲學習筆記16章,數據保護和備份技術

分享圖片 做了 批量 san 最新 div 引入 dir 通信 數據保護 所謂數據保護是指對當前時間點上的數據進行備份, 如果說一份數據被誤刪除了,可以通過備份數據找回來。 從底層來分,數據保護可以分為文件級保護和塊級保護。 文件級備份 文件級備份:將磁盤上所有文件通

大話存儲學習筆記20章,雲存儲

9.png 分布式存儲 開發平臺 per 空間占用 而是 效率 增加 響應 目前雲計算、雲存儲、雲備份等技術可謂是鋪天蓋地,其中不乏有很多是渾水摸魚的,本來沒有多少雲的性質,只是打著雲的旗號來炒作而已。 目前市場對一款產品是否是雲,沒有明顯的界定。因為雲本來就沒有一個標準。