[Python] 머신러닝 패키지 및 함수 정리


패키지 설치


conda prompt에서 입력

scickit-learn 설치

conda install scikit-learn

XGBoost, LightGBM 설치

conda install -c anaconda py-xgboost # XGBoost
conda install -c conda-forge lightgbm # LightGBM

Imbalanced Lear(SMOTE)

conda install -c conda-forge imbalanced-learn



패키지 임포트


필수 패키지

import datetime
import time
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns # seaborn
import warnings
warnings.filterwarnings("ignore") # 경고메세지 무시

사이킷런 패키지

기본 데이터 패키지

from sklearn.datasets import load_iris # iris
from sklearn.datasets import load_boston # boston
from sklearn.datasets import make_blobs # 군집화용 생성
X, y = make_blobs(n_samples=200, n_features=2, centers=3, cluster_std=0.8, random_state=0) # cluster_std로 데이터의 분포도를 조절할 수 있음
from sklearn.datasets import make_classification # 분류용 데이터 생성

전처리 패키지

from sklearn.model_selection import train_test_split # train test split
from sklearn.model_selection import KFold # KFold
from sklearn.model_selection import cross_val_score # 교차검증
from sklearn.model_selection import GridSearchCV # 그리드서치
from imblearn.oversampling import SMOTE # 오버샘플링
from sklearn.preprocessing import scale

분류 패키지

# sklearn
from sklearn.tree import DecisionTreeClassifier # 결정트리
from sklearn.linear_model import LogisticRegression # 로지스틱 회귀
from sklearn.ensemble import RandomForestClassifier # RF
from lightgbm import LGBMClassifier #LGBM
from xgboost import XGBClassifier #XGBoost
from sklearn.metrics import accuracy_score, f1_score, confusion_matrix, precision_score, recall_score, roc_auc_score # 분류 평가패키지

회귀 패키지

from sklearn.linear_model import LinearRegression # 선형회귀
from sklearn.preprocessing import PolynomialFeatures # 다항회귀
from sklearn.linear_model import Ridge, Lasso, ElasticNet # Ridge, Lasso, ElsasticNet
from sklearn.ensemble import RandomForestRegressor # 랜덤포레스트
from sklearn.tree import DecisionTreeRegressor # 결정트리
from sklearn.ensemble import GradientBoostingRegressor # 그래디언트부스트
from xgboost import XGBRegressor # XGBoosdt
from lightgbm import LGBMRegressor # LGBM
from sklearn.metrics import mean_squared_error, r2_score # MSE, R_square

군집화 패키지

from sklearn.cluster import KMeans # K-means
from sklearn.mixture import GaussianMixture # GMM
from sklearn.metrics import silhouette_samples, silhouette_score # 실루엣 점수
from sklearn.cluster import DBSCAN # DBSCAN

차원축소 패키지

from sklearn.decomposition import PCA

텍스트 패키지

from sklearn.feature_extraction.text import CountVectorizer # CountVec
from sklearn.mterics.pairwise import cosine_similarity # 코사인 유사도
from ast import literal_eval # 리스트 내의 딕셔너리 형태의 스트링 값을 객체로 바꿔주기 위해 사용

기타 패키지




기타


마커 목록

markers = [‘o’,’s’,’^’,’P’,’D’,’H’,’x’] # 마커목록

Pandas 데이터 핸들링

df.groupby(["InvoiceNo", "StockCode"])["InvoiceNo"].count().mean() # 두유일한 식별자인지 확인하기


유용한 함수


기타 함수

문자열 -> 객체 변환

from ast import literal_eval

# literal_eval을 통해 문자열을 객체로 변환
movies_df["keywords"] = movies_df["keywords"].apply(literal_eval)

머신러닝

f1, 재현율, 정밀도, 오차행렬, roc_auc 반환 함수

# f1, 재현율, 정밀도, 오차행렬, roc_auc
from sklearn.metrics import accuracy_score, f1_score, confusion_matrix, precision_score, recall_score, roc_auc_score 

# 이진분류 평가용 함수
def get_clf_eval(y_test, pred, pred_proba=None):
    confusion = confusion_matrix(y_test, pred)
    accuracy = accuracy_score(y_test, pred)
    precision = precision_score(y_test, pred)
    recall = recall_score(y_test, pred)
    f1 = f1_score(y_test, pred)
    roc_auc = roc_auc_score(y_test, pred_proba)
    
    print("오차행렬")
    print(confusion)
    print(f"정확도 : {accuracy:.4f}, 정밀도 : {precision:.4f}, 재현율 : {recall:.4f}, F1: {f1:.4f}, AUC : {roc_auc:.4f}")

모델 학습/예측/평가 수행

# sklearn의 Estimator 객체와 학습/테스트 데이터 세트를 받아 학습/예측/평가 수행
def get_model_train_eval(model, ftr_train=None, ftr_test=None, tgt_train=None, tgt_test=None):
    model.fit(ftr_train, tgt_train)
    pred = model.predict(ftr_test)
    pred_proba = model.predict_proba(ftr_test)[:,1]
    get_clf_eval(tgt_test, pred, pred_proba) # 위에서 작성한 평가 함수

군집 시각화

### 여러개의 클러스터링 갯수를 List로 입력 받아 각각의 실루엣 계수를 면적으로 시각화한 함수 작성  
def visualize_silhouette(cluster_lists, X_features): 
    
    from sklearn.datasets import make_blobs
    from sklearn.cluster import KMeans
    from sklearn.metrics import silhouette_samples, silhouette_score

    import matplotlib.pyplot as plt
    import matplotlib.cm as cm
    import math
    
    # 입력값으로 클러스터링 갯수들을 리스트로 받아서, 각 갯수별로 클러스터링을 적용하고 실루엣 개수를 구함
    n_cols = len(cluster_lists)
    
    # plt.subplots()으로 리스트에 기재된 클러스터링 만큼의 sub figures를 가지는 axs 생성 
    fig, axs = plt.subplots(figsize=(4*n_cols, 4), nrows=1, ncols=n_cols)
    
    # 리스트에 기재된 클러스터링 갯수들을 차례로 iteration 수행하면서 실루엣 개수 시각화
    for ind, n_cluster in enumerate(cluster_lists):
        
        # KMeans 클러스터링 수행하고, 실루엣 스코어와 개별 데이터의 실루엣 값 계산. 
        clusterer = KMeans(n_clusters = n_cluster, max_iter=500, random_state=0)
        cluster_labels = clusterer.fit_predict(X_features)
        
        sil_avg = silhouette_score(X_features, cluster_labels)
        sil_values = silhouette_samples(X_features, cluster_labels)
        
        y_lower = 10
        axs[ind].set_title('Number of Cluster : '+ str(n_cluster)+'\n' \
                          'Silhouette Score :' + str(round(sil_avg,3)) )
        axs[ind].set_xlabel("The silhouette coefficient values")
        axs[ind].set_ylabel("Cluster label")
        axs[ind].set_xlim([-0.1, 1])
        axs[ind].set_ylim([0, len(X_features) + (n_cluster + 1) * 10])
        axs[ind].set_yticks([])  # Clear the yaxis labels / ticks
        axs[ind].set_xticks([0, 0.2, 0.4, 0.6, 0.8, 1])
        
        # 클러스터링 갯수별로 fill_betweenx( )형태의 막대 그래프 표현. 
        for i in range(n_cluster):
            ith_cluster_sil_values = sil_values[cluster_labels==i]
            ith_cluster_sil_values.sort()
            
            size_cluster_i = ith_cluster_sil_values.shape[0]
            y_upper = y_lower + size_cluster_i
            
            color = cm.nipy_spectral(float(i) / n_cluster)
            axs[ind].fill_betweenx(np.arange(y_lower, y_upper), 0, ith_cluster_sil_values, \
                                facecolor=color, edgecolor=color, alpha=0.7)
            axs[ind].text(-0.05, y_lower + 0.5 * size_cluster_i, str(i))
            y_lower = y_upper + 10
            
        axs[ind].axvline(x=sil_avg, color="red", linestyle="--")


### 여러개의 클러스터링 갯수를 List로 입력 받아 각각의 클러스터링 결과를 시각화 
def visualize_kmeans_plot_multi(cluster_lists, X_features):
    
    from sklearn.cluster import KMeans
    from sklearn.decomposition import PCA
    import pandas as pd
    import numpy as np
    
    # plt.subplots()으로 리스트에 기재된 클러스터링 만큼의 sub figures를 가지는 axs 생성 
    n_cols = len(cluster_lists)
    fig, axs = plt.subplots(figsize=(4*n_cols, 4), nrows=1, ncols=n_cols)
    
    # 입력 데이터의 FEATURE가 여러개일 경우 2차원 데이터 시각화가 어려우므로 PCA 변환하여 2차원 시각화
    pca = PCA(n_components=2)
    pca_transformed = pca.fit_transform(X_features)
    dataframe = pd.DataFrame(pca_transformed, columns=['PCA1','PCA2'])
    
     # 리스트에 기재된 클러스터링 갯수들을 차례로 iteration 수행하면서 KMeans 클러스터링 수행하고 시각화
    for ind, n_cluster in enumerate(cluster_lists):
        
        # KMeans 클러스터링으로 클러스터링 결과를 dataframe에 저장. 
        clusterer = KMeans(n_clusters = n_cluster, max_iter=500, random_state=0)
        cluster_labels = clusterer.fit_predict(pca_transformed)
        dataframe['cluster']=cluster_labels
        
        unique_labels = np.unique(clusterer.labels_)
        markers=['o', 's', '^', 'x', '*']
       
        # 클러스터링 결과값 별로 scatter plot 으로 시각화
        for label in unique_labels:
            label_df = dataframe[dataframe['cluster']==label]
            if label == -1:
                cluster_legend = 'Noise'
            else :
                cluster_legend = 'Cluster '+str(label)           
            axs[ind].scatter(x=label_df['PCA1'], y=label_df['PCA2'], s=70,\
                        edgecolor='k', marker=markers[label], label=cluster_legend)

        axs[ind].set_title('Number of Cluster : '+ str(n_cluster))    
        axs[ind].legend(loc='upper right')
    
    plt.show()



© 2021.04. by Jessie

Powered by jessie