본문 바로가기

코딩/Python

머신러닝 알고리즘 익히기(Logistic Regression, Random Forest, Gradient Boosting, Light GBM),

반응형

 

import numpy as np  
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns 
%matplotlib inline  #노트북안에서 바로 그래프를 출력하여 보여줌

import warnings
warnings.filterwarnings('ignore')

#데이터 불러오기
datapath = 'https://github.com/mchoimis/tsdl/raw/main/income/'
df = pd.io.parsers.read_csv(datapath + 'income.csv')
df.head()

# 데이터 형태 확인
print(df.shape)
print(df.columns)
df.info()

# 결측치(NA, 없는 값)를 NaN으로 바꾸기
df[df=='?'] = np.nan
df.head()

# 최빈값으로 결측치 채우기
for col in ['workclass', 'occupation', 'native.country']:
    df[col].fillna(df[col].mode()[0], inplace=True)
    #선택한 열(column)에서 가장 자주 나타나는 최빈값(mode) 중 첫 번째[0] (참고 median 중간값)

df.isnull().sum()

X =  df.drop(['income', 'education', 'fnlwgt'], axis = 1)
y =  df['income']

 

원 데이터를 training set과 test set으로 나누기
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test =  train_test_split(X, y, test_size = 0.3, random_state = 0)

 

범주변수 처리는 2가지
  • 클래스를 숫자로 변환
#LabelEncoder
#예시1
from sklearn import preprocessing

le = preprocessing.LabelEncoder()
le.fit(["red", "green", "blue"]) # 라벨 정보 학습
print(le.transform(["red", "red", "blue", "green"])) # 데이터 변환

#예시2
from sklearn import preprocessing

categorical = ['workclass', 'marital.status', 'occupation', 'relationship', 'race', 'sex', 'native.country']
for feature in categorical:
        le =  preprocessing.LabelEncoder()
        X_train[feature] =  le.fit_transform(X_train[feature]) 
        X_test[feature] =   le.transform(X_test[feature]) 
        # train으로 라벨인코더를 한 후 test에서 동일한 매핑을 사용하여 범주형 값을 나누기 위함.

 

  • 원-핫 인코딩(더미코딩)

 

 

(참고)  scikit-learn에서 제공하는 피처 스케일러(scaler)
  •  `StandardScaler`: 기본 스케일, 각 피처의 평균을 0, 표준편차를 1로 변환
  •  `RobustScaler`: 위와 유사하지만 평균 대신 중간값(median)과 일분위, 삼분위값(quartile)을 사용하여 이상치 영향을 최소화
  •  `MinMaxScaler`: 모든 피처의 최대치와 최소치가 각각 1, 0이 되도록 스케일 조정
  •  `Normalizer`: 피처(컬럼)이 아니라 row마다 정규화되며, 유클리드 거리가 1이 되도록 데이터를 조정하여 빠르게 학습할 수 있게 함

 

 


 

알고리즘 구현

 

# Feature scaling 전 원본 데이터
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
#accuracy_score는 분류 문제에서 모델의 예측 결과와 실제 레이블을 비교하여 정확도를 계산하는 함수

logreg =  LogisticRegression()
#LogisticRegression() 함수는 fit()사용하여 모델 학습, predict()사용하여 데이터 결과 예측
logreg.fit(X_train, y_train)
y_pred = logreg.predict(X_test)

# logreg_score =  accuracy_score(y_test, y_pred)
print('Logistic Regression accuracy score: {0:0.4f}'. format(accuracy_score(y_test, y_pred)))

 

스케일이 조정된 알고리즘 구현
# Feature scaling 후 변환 데이터
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

logreg = LogisticRegression()
logreg.fit(X_train_scaled, y_train) #스케일 조정'scaled'

 

스케일 조정된 데이터를 이용한 Logistic Regression 모델 분류결과 확인하기
from sklearn.metrics import classification_report

cm_logreg_scaled_data =  classification_report(y_test, y_pred_scaled_data) 
print(cm_logreg_scaled_data)

*f1-score는 다음에

 

 

Random Forest 모델 구현하고 정확도 확인하기
from sklearn.ensemble import RandomForestClassifier  #ensemble모델 中 RandomforestClassifier
from sklearn.metrics import accuracy_score

rfc = RandomForestClassifier()
rfc.fit(X_train, y_train)

# 분류 모델 하이퍼 파라미터 예시
criterion='gini' # The function to measure the quality of a split. Supported criteria are “gini” for the Gini impurity and “entropy” for the information gain (정보 이득)
n_estimators=100 # The number of trees in the forest.

y_pred = rfc.predict(X_test) 
rfc_score =  accuracy_score(y_test, y_pred)
print('Random Forest Model accuracy score : {0:0.4f}'. format(rfc_score ))

Random Forest Model accuracy score : 0.8475

 

 

Random Forest 모델의 Confusion Matrix 확인하기

 

from sklearn.metrics import confusion_matrix

cm =  confusion_matrix(y_test, y_pred)
print('Confusion Matrix for Binary Labels \n')
# print('Confusion Matrix for Binary Labels\n')
# print('Actual class')
# print('Predicted', '[[True Positive', 'False Positive]')
# print('         ', '[False Negative', 'True Negative]]')
print(cm)

# Confusion Matrix에서 Recall과 Precision 계산하기

print('\nRecall for Class [<=50K] = ', cm[0,0], '/' , cm[0,0] + cm[0,1])
print('\nPrecision for Class [<=50K] = ', cm[0,0], '/' , cm[0,0] + cm[1,0])
print('\nRecall for Class [>50K] = ', cm[1,1], '/' , cm[1,0] + cm[1,1])
print('\nPrecision for Class [>50K] = ', cm[1,1], '/' , cm[0,1] + cm[1,1])


#결과확인
from sklearn.metrics import classification_report

cm_rfc =  classification_report(y_test, y_pred)
print(cm_rfc)

 

Gradient Boosting 모델 구현하고 정확도 확인하기
from sklearn.ensemble import GradientBoostingClassifier

gbc =  GradientBoostingClassifier(random_state=0)
gbc.fit(X_train, y_train)

y_pred =  gbc.predict(X_test)
gbc_score =  accuracy_score(y_test, y_pred)
print('Gradient Boosting accuracy score : {0:0.4f}'.format(gbc_score))

from sklearn.metrics import classification_report

cm_gbc =  classification_report(y_test, y_pred)
print(cm_gbc)

 

Light GBM 구현하고 정확도 확인하기
from lightgbm import LGBMClassifier
from sklearn.metrics import accuracy_score

lgbm =  LGBMClassifier(random_state=0)
lgbm.fit(X_train, y_train)
y_pred =  lgbm.predict(X_test)

lgbm_score =  accuracy_score(y_test, y_pred)
print('LGBM Model accuracy score : {0:0.4f}'.format(lgbm_score))

from sklearn.metrics import classification_report

cm_lgbm =  classification_report(y_test, y_pred)
print(cm_lgbm)

요약

logistic Regression은 일부 오류 있는 듯

 

 

출처: 패스트캠퍼스

반응형