[초 매개 변수 우수 찾기] 교차 검증 (Cross Validation) 초 매개 변수 우수 찾기 python 실현: 다 중 매개 변수 우수 찾기

[초 매개 변수 우수 찾기] 교차 검증 (Cross Validation) 초 매개 변수 우수 찾기 python 실현: 다 중 매개 변수 우수 찾기
  • 1. 격자 검색 원리
  • 2. 격자 검색 + 교차 검증 은 다 중 매개 변수 에서 우 위 를 찾 는 python 실현
  • 1. 훈련 모델 과 우수 매개 변수
  • 2. 격자 검색 + cross 을 직접 순환 하여 구현 합 니 다.validation
  • 3、GridSearchCV
  • 참고 자료
  • 교차 검증 의 기초 지식 은 이전 블 로 그 를 참고 할 수 있 습 니 다. 본 블 로 그 는 교차 검증 을 통 해 다 중 매개 변수 검색 방법 을 소개 합 니 다. 그리드 검색 (Grid Search) 과 그리드 검색 두 가지 자주 사용 하 는 python 실현 방식 입 니 다.
    1. 격자 검색 원리
    격자 검색 은 여러 매개 변 수 를 반복 적 으로 옮 겨 다 니 는 가능 한 값 을 추출 할 수 있 는 검색 방법 으로 성능 이 가장 좋 은 모델 에 대응 하 는 매개 변 수 는 가장 좋 은 매개 변수 입 니 다.
    2. 격자 검색 + 교차 검증 은 다 중 매개 변수 에서 우수한 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} W,emin​21​∥W∥2+2C​i=1∑m​ei​2s.t.yi​(W⋅φ(xi​)+b)≥1−ei​,i=1,⋯,me≥0,i=1,⋯,m​
    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} αmin​21​i∑m​j∑m​αi​αj​yiyjK(xi​,xj​)−i=1∑m​αi​s.t.i=1∑m​αi​yi=00≤αi​≤C,i=1,⋯,m​
    그 중: K (x i, x j) = exp ⁡ (− ‖ x i − x j ‖ 2σ 2 ) K\left( {{x_i},{x_j}} \right) = \exp \left( { - \frac{{{{\left\| {{x_i} - {x_j}} \right\|}^2}}}{{2{\sigma ^2}}}} \right) K(xi​,xj​)=exp(−2σ2∥xi​−xj​∥2​)
    비 선형 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(":")
                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.2 GridSearchCV(    +CV)
    param_grid = {'C': c_list,
                  'gamma':gamma_list}
    
    rbf_svm1 = svm.SVC(kernel = 'rbf')
    grid = GridSearchCV(rbf_svm1, param_grid, cv=3, scoring='accuracy')
    grid.fit(trainX,trainY)
    best_parameter = grid.best_params_
    print(best_parameter)
    

    참고 자료
    1.https://blog.csdn.net/google19890102/article/details/35989959

    좋은 웹페이지 즐겨찾기