티스토리 뷰

1. 항공권 가격 예측 모델링 [회귀]

1. 데이터 파악 및 전처리(결측치 처리, 중복 data point 처리, feature selection 등)

# 데이터 불러오기

# 판다스 라이브러리 불러오기
import pandas as pd
cdf = pd.read_csv("../data/Clean_Dataset.csv")

# 학습시간 단축을 위해 5000건만 추출하기
cdf = cdf[:5000]

# 데이터 확인하기
cdf.head(1) 
-----------------------------------------------------------------------------------------------
# 데이터 전처리하기 

# Unnamed: 0 데이터 분포 확인하기
cdf["Unnamed: 0"].value_counts() 

# Unnamed 컬럼 삭제하기
cdf.drop("Unnamed: 0", axis = 1, inplace =True)

 # 기초 통계정보 확인하기
cdf.describe(include='all')

# info를 통해 Null 데이터 및 type 확인 있는지 1차 확인하기(isna를 사용해도 됨)
print("Null 데이터 확인")
cdf.info() 

# 첫 번째 컬럼이 의미있는 컬럼인지 확인하기 위해 value_count로 분포 확인하기
cdf.airline.value_counts()

# 그래프 라이브러리 불러오기(matplotlib, seaborn)
import matplotlib.pyplot as plt
import seaborn as sns

# Seaborn 으로 막대그래프 그리기
# 배경 사이즈 설정하기
plt.figure(figsize=(5,5))
# 막대그래프 차트 그리기 
ax = sns.barplot(x='airline', y='price', data=cdf, hue='airline')
# 상단 타이틀 지정하기
ax.set(title='airline & price')
# 그래프 출력하기
plt.show() 

# 2번째 flight 값 재확인하기
cdf.head(1)

# flight column 분포 확인하기
cdf.flight.value_counts()

# flight 칼럼은 다른 칼럼과 의미가 중복되는 것으로 보이므로 삭제하기
cdf.drop('flight', axis=1, inplace=True)

# 잘 삭제되었는지 shape 확인하기
cdf.shape

 

2. 원핫 인코딩

# one_hot 인코딩을 위해 get_dummies 처리하기
dummies_cdf = pd.get_dummies(cdf, 
               columns=["airline", 'source_city','departure_time', 'stops','arrival_time', 'destination_city', 'class'],
               drop_first=True
              )
              
              
# 인코딩 확인하기
print(f'''원핫인코딩 전 {cdf.shape}
원핫인코딩 후 {dummies_cdf.shape}''')

 

2. 학습 데이터 만들기

# 데이터프레임에서 타깃 변수만 y로 추출하기
y = dummies_cdf.price

# 데이터프레임에서 타깃 변수를 제외한 입력 데이터세트를 생성하기
x = dummies_cdf.drop('price', axis=1)

x.head(5)

# shape 확인하기
x.shape, y.shape

 

3. 모델 학습하기

# xgboost, lightgbm모델 설치하기
!pip install xgboost
!pip install lightgbm

# scikit learn 기반 라이브러리 불러오기
from sklearn.linear_model import LinearRegression
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import RandomForestRegressor
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.ensemble import ExtraTreesRegressor

# scikit learn 외 라이브러리 불러오기
from xgboost import XGBRFRegressor
from lightgbm import LGBMRegressor

# 학습_검증 데이터 분리 라이브러리 불러오기
from sklearn.model_selection import train_test_split
---------------------------------------------------------------------------------------------
# 머신러닝 모델 생성하기
# 모델 생성 시 n_jobs 옵션이 있는 모델은 -1을 적용하여 동작 시키는 것을 권유함
lr = LinearRegression( n_jobs=-1)
dtr = DecisionTreeRegressor( random_state=1)
rfr = RandomForestRegressor( random_state=1)
gbr = GradientBoostingRegressor( random_state=1)
xgbr = XGBRFRegressor(n_jobs=-1, random_state=1)
etr = ExtraTreesRegressor(n_jobs=-1, random_state=1)
lgbmr = LGBMRegressor(n_jobs=-1, random_state=1)
---------------------------------------------------------------------------------------------
# 훈련 데이터 분할하기
x_train, x_test, y_train ,y_test = train_test_split(x, y , 
                   test_size=0.3,
                   random_state=2023, # 서로 다른 결과를 나타내지 않기
                )

# shape 확인하기
x_test.shape, y_test.shape

# shape 확인하기
x_train.shape, y_train.shape
---------------------------------------------------------------------------------------------
%%time 
# 머신러닝 모델(base 모델) 학습하기

lr.fit(x_train, y_train)
dtr.fit(x_train, y_train)
rfr.fit(x_train, y_train)
gbr.fit(x_train, y_train)
xgbr.fit(x_train, y_train)
etr.fit(x_train, y_train)
lgbmr.fit(x_train, y_train)
---------------------------------------------------------------------------------------------
# 결과 검증용 라이브러리 불러오기
from sklearn.metrics import r2_score
from sklearn.metrics import mean_squared_error

# 리스트에 모델 입력하기
models = [lr, dtr, rfr, gbr, xgbr, etr, lgbmr]

r2_score_list = []
rmse_score_list = []

# 모델 결과 확인하기
for model in models:
    pred = model.predict(x_test)
    r2_score_list.append(
        round(r2_score(y_test, pred),5)
    )
    # squared를 False로 하면 RMSE가 됨
    rmse_score_list.append(
        round(mean_squared_error(
            y_test, pred, squared=False),5)
    ) 
    
r2_score_df = pd.DataFrame([r2_score_list, rmse_score_list], 
                           columns=["lr", "dtr", "rfr", "gbr", "xgbr", "etr","lgbmr"],
                           index=["r2", "rmse"]
                          )

r2_score_df

 

4. 최적의 파라미터 찾기(GridSearchCV)

# GridSearchCV 라이브러리 불러오기
from sklearn.model_selection import GridSearchCV

# 비교 하이퍼파라미터 선정하기
param_grid = { 
    'learning_rate': [0.1 ,0.01, 0.003],
    'colsample_bytree': [0.5, 0.7],
    'max_depth' : [ 20,30,40],
}

# 최적 하이퍼파라미터 검색하기
cv_lgbmr = GridSearchCV(estimator=lgbmr,
                      param_grid=param_grid,
                      cv= 5,
                      verbose=1
                     )

cv_lgbmr.fit(x_train, y_train)


# 최적 하이퍼파라미터 조합 확인하기
cv_lgbmr.best_params_

# 최적 하이퍼파라미터 결과 확인하기
cv_lgbmr.best_score_ # 예측 정확도 확인하기

-----------------------------------------------------------------------------------------------
# 머신러닝 모델 검증하기
# 최적의 하이퍼파라미터로 재학습하기
best_lgbmr = LGBMRegressor(max_depth= 30, 
                                 colsample_bytree= 0.7,
                                 learning_rate= 0.1,
                                 n_jobs=-1,
                                 random_state= 1
                                )
best_lgbmr.fit(x_train,y_train)

# 모델 성능 검증하기
b_pred=best_lgbmr.predict(x_test)
print('r2 : ', round(r2_score(y_test, b_pred),5))
print('rmse : ', round(mean_squared_error(y_test, b_pred, squared=False),5))

 

Randomized Search CV로도 최적 파라미터 찾기 가능 

# RandomizedSearchCV 라이브러리 호출하기
from sklearn.model_selection import RandomizedSearchCV

# 비교 파라미터 선정하기
param_dists = { 
    'learning_rate': [0.1 ,0.01, 0.003],
    'colsample_bytree': [0.5, 0.7],
    'max_depth' : [ 20,30,40],
}

%%time
# 최적 파라미터 검색하기
cv_lgbmr = RandomizedSearchCV(estimator=lgbmr,
                      param_distributions=param_dists,
                      n_iter = 500,
                      cv= 5,
                      verbose=1
                     )

cv_lgbmr.fit(x_train, y_train)

# 최적의 파라미터 조합 확인하기
cv_lgbmr.best_params_

 


 

2. 고객 만족여부 예측 모델링 [분류]

1. 데이터 전처리

# 데이터 불러오기

# 판다스 라이브러리 불러오기
import pandas as pd 

# 파일이 저장된 경로에서 데이터 로딩하기
cdf = pd.read_csv("../data/Invistico_Airline.csv") 

# 학습시간 단축을 위해 5,000건만 추출하기
cdf = cdf[:5000]

# 중간에 Column 이 '...'으로 표시되는 것 확인하기
cdf.head(1) 

# 모든 칼럼을 표시하기
pd.set_option('display.max_columns', None) 
cdf.head(1)

---------------------------------------------------------------------------------------------
# 데이터 전처리하기

# 레이블 불균형 확인 
cdf.satisfaction.value_counts() 

# null 데이터 확인하기
cdf.info()

# 결측치 행 삭제하기
cdf.dropna(axis=0, inplace=True)

# 삭제 여부 확인하기
cdf.info() 

# 라벨 데이터 y를 나누기

# cdf 데이터프레임에서 label만 y로 추출하기
y = cdf.satisfaction 


# price 칼럼 삭제하고 입력 데이터 만들기
x = cdf.drop("satisfaction", axis=1 ) 

# 데이터 크기 확인하기
x.shape, y.shape

 

2. 인코딩

# 원핫 인코딩하기 (인풋)

# info 메소드로 데이터 유형 확인하기
x.info() 

# get_dummies 함수를 활용해 object 유형의 칼럼을 원핫 인코딩하기
x_gd = pd.get_dummies(x, 
               columns=['Gender', 'Customer Type',
                        'Type of Travel', 'Class'], 
               drop_first=False)
x_gd.info()
x_gd.head(5)
---------------------------------------------------------------------------------------------
# 레이블 인코딩하기 (아웃풋)

# 라이브러리 불러오기
from sklearn.model_selection import train_test_split 
from sklearn.preprocessing import LabelEncoder 

# train_test_split 수행하기
x_train, x_test, y_train ,y_test = train_test_split( x_gd, y, stratify=y, test_size=0.2, random_state=2023)

# 레이블 인코더 생성하기
le = LabelEncoder() 

# fit을 통해 y_train의 값마다 0과 1을 부여하는 규칙 생성하기
le.fit(y_train) 

#y_train을 레이블 인코딩하기
le_y_train = le.transform(y_train) 

#y_test를 레이블 인코딩하기
le_y_test = le.transform(y_test) 

# 인코딩이 수행된 데이터 확인하기
print('레이블 인코딩 후 데이터 :',le_y_train) 

# 라벨 별로 어떤 값이 부여되어 있는지 규칙 확인하기
print('레이블 인코딩 클래스 확인 :',le.classes_) 

# 레이블 인코딩된 데이터를 디코딩했을 때 데이터 확인하기
print('레이블 인코딩을 디코딩 했을 때 :',le.inverse_transform(le_y_train))

 

3. 모델 학습하기

%%time
# 다양한 학습 모델 불러오기
# scikit-learn 기반 모델 불러오기
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.ensemble import ExtraTreesClassifier

# scikit-learn 이외의 모델 불러오기
from xgboost import XGBRFClassifier
from lightgbm import LGBMClassifier

# 모델 생성하기
lr = LogisticRegression()
dtc = DecisionTreeClassifier(random_state=1)
rfc = RandomForestClassifier(random_state=1)
gbc = GradientBoostingClassifier(random_state=1)
xgbc = XGBRFClassifier(random_state=1)
etc = ExtraTreesClassifier(random_state=1)
lgbmc = LGBMClassifier(random_state=1)

# 모델 학습 수행하기
lr.fit(x_train, le_y_train)
dtc.fit(x_train, le_y_train)
rfc.fit(x_train, le_y_train)
gbc.fit(x_train, le_y_train)
xgbc.fit(x_train, le_y_train)
etc.fit(x_train, le_y_train)
lgbmc.fit(x_train, le_y_train)

# 순서대로 적용할 모델을 리스트에 저장하기
models = [lr, dtc, rfc, gbc, xgbc, etc, lgbmc]

# for문을 활용해 학습 모델 별 Score를 리스트에 저장하기
acc_train_list = []
acc_test_list = []
for model in models:
    acc_train_list.append(round(model.score(x_train, le_y_train),5))
    acc_test_list.append(round(model.score(x_test, le_y_test),5))

# 모델 별 정확도를 출력하기
for i in range(len(models)):
    print('학습모델 : ',models[i])
    print('train 정확도: ',acc_train_list[i])
    print('test 정확도: ',acc_test_list[i])
    print('----------------------------------')
  • 모델 선택

4. 최적의 하이퍼파라미터 및 모델 재학습

%%time
#GridSearchCV를 불러오기
from sklearn.model_selection import GridSearchCV 

# param_grid를 정의하여 각 파라미터 별로 교차해서 모든 학습을 수행하기
param_grid = { 
    'n_estimators': [50 ,100, 200, 500],
    'max_features': ['sqrt', 'log2', None],
    'max_depth' : [10,20,30,40,50,None],
}

# estimator=rfc :가장 우수한 모델이었던 rfc 활용하기
# param_grid=param_grid : 미리 정의한 파라미터들을 교차 적용하기
# n_jobs=-1 : -1로 지정하면 모든 CPU 활용하기
cv_rfc = GridSearchCV(
    estimator=rfc, 
    param_grid=param_grid, 
    n_jobs=-1,
    cv=5)

# 학습 수행하기
cv_rfc.fit(x_train, le_y_train) 

# best_score를 출력하기
print('최적의 파라미터 학습시 Score :',round(cv_rfc.best_score_ , 5)) 

# best params을 출력하기
print('최적의 파라미터 :',cv_rfc.best_params_)

---------------------------------------------------------------------------------------------
# 최적의 하이퍼파라미터로 도출된 값을 모델에 입력하기
rfc = RandomForestClassifier(
    n_estimators = 50,
    max_features = None,
    n_jobs=-1,
    max_depth = 10)

# rfc 학습 수행하기
rfc.fit(x_train, le_y_train) 

# 이전에 하이퍼파라미터 설정 없이 수행했을 때의 정확도 확인하기
print('기존 모델의 Test 정확도: 1.0') 

# 최적의 하이퍼파라미터 입력 후 학습시킨 모델의 정확도 확인하기
print('최적의 하이퍼 파라미터 반영한 모델의 Test 정확도: ',round(rfc.score(x_test, le_y_test),5)) 

# 향상된 정확도 gap 계산하기
print('정확도 향상: ',round(rfc.score(x_test, le_y_test)-1.0 , 5))

 

5. 오차행렬으로 모델 평가하기

# 라이브러리 불러오기
from sklearn.metrics import confusion_matrix
from sklearn.metrics import ConfusionMatrixDisplay
from sklearn.metrics import classification_report

# rfc 모델로 x_test를 예측한 값을 y_pred로 저장하기
y_pred = rfc.predict(x_test) 

# 실제값 le_y_test(레이블 인코딩을 해야 0,1로 표현됨)와 예측값 y_pred 비교하기
cm = confusion_matrix(le_y_test, y_pred, labels=[0,1])
disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=[0,1])
disp.plot()

# 오차행렬(Confusion Matrix) 출력하기
plt.show() 

# 오차행렬(Confusion Matrix)를 통한 각종 지표들을 리포트로 출력하기
print(classification_report(le_y_test, y_pred))
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함