머신러닝/machine learning

classification, KKN(k-nearest neighbors), evaluate metrics, f1 score, log loss, Jaccard index

Olivia-BlackCherry 2023. 5. 17. 18:03

목차

    classification 분류 모델

    분류 모델은 지도방법에 속한다. 아이템들을 서로 다른 카테고리나 클래스로 분류하는 작업이다. 

    target attribute는 categorical한 variable로 binary하거나 multi한 클래스로 분류할 수 있다. 

    machine learning에는 다양한 종류의 알고리즘이 있다. 

    decision trees, Naive Bayes, linear discriminant analysis, k-nearest neighbor, logistic regression, neural networks, support vector machines

     

    1) K-nearest Neighbours(KNN)

    K 이웃의 수

    nearest neighbors 가까운 이웃이다.

    먼저 k 숫자를 선정한다.

    (어떻게 k개를 선정할 것인가?

    만약 k=1이라면, 신뢰할 수 없는 결과를 얻을 수 있다. nearest neighbor이 노이즈거나 아웃라이어일 수 있기 때문이다. 특정한 값에 대하여 학습을 하고나면 자칫하면 ovefitting을 유발할 수 있다.

    만약 k=20이라면, 과도한 일반화가 일어날 수 있다.

    k를 선정하는 가장 좋은 방법은, 각각의 k값에 대하여 test set으로 모델을 평가해보는 것이다. 

    가장 높은 accuracy가 나오는 모델이 좋다고 판단하고, 그 값을 선택하면 된다.)

     

    unknown case와 모든 데이터 셋들과의 거리를 계산한다.

    (유클리드 거리)

    그 중 unknown data point와 가장 가까운 이웃들을 k개 정한다. 

    그 이웃들이 가지고 있는 값들과 가장 근사한 값을 response value로  정한다. 

    #데이터 다운로드 받기
    df = pd.read_csv('teleCust1000t.csv')
    df.head()
    
    #타겟의 총 개수를 살펴보기
    df['custcat'].value_counts()
    
    #시각화하기, bin:막대기수
    df.hist(column='income', bins=50)
    
    #칼럼 살펴보기
    df.columns
    
    #instance값들만 가져와서 X에 담기
    X = df[['region', 'tenure','age', 'marital', 'address', 'income', 'ed', 'employ','retire', 'gender', 'reside']].values  #.astype(float)
    X[0:5]
    
    #타겟 값들만 가져와서 Y에 담기
    y = df['custcat'].values
    y[0:5]
    
    #데이터 전처리 preprocessing (normalize data)
    X = preprocessing.StandardScaler().fit(X).transform(X.astype(float))
    X[0:5]
    
    #모델링 
    #train/test split
    from sklearn.model_selection import train_test_split
    X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=4)
    print ('Train set:', X_train.shape,  y_train.shape)
    print ('Test set:', X_test.shape,  y_test.shape)
    
    #적합한 모델 선택하기 k-nearest neighbor
    from sklearn.neighbors import KNeighborsClassifier
    
    #파라미터 k값 정하기
    k=4
    neigh = KNeighborsClassifier(n_neighbors=k).fit(X_train, y_train)
    neigh
    
    #Predicting 모델예측값 보기
    yhat= neigh.predict(X_test)
    yhat[0:5]
    
    #모델 평가하기
    from sklearn import metrics
    print("Train set Accuracy: ", metrics.accuracy_score(y_train, neigh.predict(X_train)))
    print("Test set Accuracy: ", metrics.accuracy_score(y_test, yhat))
    
    #k값 수정해보기
    k=6
    neigh=KNeighborsClassifier(n_neighbors=k).fit(X_train, y_train)
    neigh
    
    yhat=neigh.predict(X_test)
    yhat[0:5]
    
    print(metrics.accuracy_score(y_train, neigh.predict(X_train)))
    print(metrics.accuracy_score(y_test, yhat))
    
    #여러 개의 k값에 따른 평가값 확인하는 코드
    Ks = 10
    mean_acc = np.zeros((Ks-1))
    std_acc = np.zeros((Ks-1))
    
    for n in range(1,Ks):
        
        #Train Model and Predict  
        neigh = KNeighborsClassifier(n_neighbors = n).fit(X_train,y_train)
        yhat=neigh.predict(X_test)
        mean_acc[n-1] = metrics.accuracy_score(y_test, yhat)
    
        
        std_acc[n-1]=np.std(yhat==y_test)/np.sqrt(yhat.shape[0])
    
    print(mean_acc)
    print(std_acc)
    
    #k값에 따른 accuracy평가값을 plot으로 그리기
    plt.plot(range(1,Ks),mean_acc,'g')
    plt.fill_between(range(1,Ks),mean_acc - 1 * std_acc,mean_acc + 1 * std_acc, alpha=0.10)
    plt.fill_between(range(1,Ks),mean_acc - 3 * std_acc,mean_acc + 3 * std_acc, alpha=0.10,color="green")
    plt.legend(('Accuracy ', '+/- 1xstd','+/- 3xstd'))
    plt.ylabel('Accuracy ')
    plt.xlabel('Number of Neighbors (K)')
    plt.tight_layout()
    plt.show()
    
    #최종적인 k 선정하기
    print( "The best accuracy was with", mean_acc.max(), "with k=", mean_acc.argmax()+1)

     

     

     

    2) 분류모델의 평가방법 evaluation metrics

    - Jaccard index

    y: 실제값

    y_hat: 모델 예측값

    0<= Jaccard index <= 1(높을 수록 높은 accuracy)

     

     

    - F1-score

    confusion metrics를 살펴보자

    Precision(정밀도)= TP/(TP+FP)

    Recall(재현율, 민감도, TPR)= TP/(TP+FN)

    0<=F1<=1(높을 수록 높은 accuracy)

     

    -Log loss

    0<=Log loss<=1(낮을 수록 높은 accuracy)