24.01.24
OpenAI
- [api keys]에서 key를 등록후 사용마다 돈을 지불해야함
- 아직까지 계속 변동하고 있어서 사용시기마다 확인하는 편이 좋음
- 코랩에서 사용하는 방법 - 설치
# 2024.01.24시점 기준
# 설치
!pip install langchain
!pip install openai
!pip install langchain-experimental
!pip install --upgrade pip
!pip install "langserve[all]"
!pip install langchain-cli
!pip install -U langchain-openai
# 패키지 설치
import os
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from getpass import getpass
### 240124 기준 설치 패지지 (매번 확인 필요)
from langchain_experimental.agents.agent_toolkits import create_pandas_dataframe_agent
from langchain_openai import OpenAI
등록한 키를 적용하고
데이터를 불러서 질문
참고) 프로젝트로 진행 시 구글 드라이브로 연동
# key
key = '등록한 key 입력'
# 데이터 부르기
path = "/content/train.csv"
df = pd.read_csv(path)
df.head()
# 날씨, 시간 등 다양한 요소를 적용하나 연습 겸 온도=0을 적용해서 진행해봄
agent = create_pandas_dataframe_agent(OpenAI(temperature=0, openai_api_key=key), df, verbose=True)
# 질의
result = agent("주어진 데이터의 샘플 수는 얼마입니까?")
result = agent("나의 df의 가로와 세로의 크기를 알려주세요")
result = agent("성별에 따른 생존율에 대한 막대그래프를 그려주세요")
=> 질의에 대한 결과를 출력해 줌.
Clustering
- 정답이 없는 것들을 ‘얼마나 유사한지’를 중심으로 끼리끼리 군집화하는 방식
K-means
- 거리의 평균 중심점을 바탕으로 구성하기 때문에 너무 값이 차이가 큰 이상값이 있으면 분류하는데 어려움이 생길 수 있음
K-medoid
- k-means의 단점을 보완하기 위해 거리의 중심값을 바탕으로 중심점을 구하는 방법
Hierarchical Clustering
- 한 점에서 가까운 점들을 하나씩 포섭하는 방식
- 그래서 어느 어떻게 거리를 정하는지, 어떻게 군집간 거리를 계산하는지에 따라서 결과가 달라짐
- 계층적으로 아래로 뻗는 하향식 방식
- 거리 계산
- 개별 값간 거리: 유클리디안, 맨허튼
- 그룹간 거리: Linkage 계산
DBSCAN
- 밀도에 대한 부분을 고려하여 묶어가는 방식
- 밀도를 어떻게 할 것인지, 그룹 안에 몇 명 이상 있어야 할지 등을 기준으로 할 것인지 등을 처리하면 됨
- K-means와 DBSCAN의 차이
SOM
- Self-Organizing Map
- 차원 축소해주면서 동시에 clustering해주는 방법
- 저차원의 격자벡터를 고차원(실제 데이터)의 데이터에 위치가 비슷하게 되도록 weight를 업데이트 하면서 진행한다.
BIRCH
- Balanced Interative Reducing and Clustering using Hiearchcies(= 바크)
- 많은 양의 데이터셋에 적용하기 위해 제시된 방법
- CF Tree를 기반으로 동작을 시켜 빠르게 연산하도록 함
- 트리를 한번쓰고 마는게 아니라 계속해서 축적시킴
- 두 가지 계산
- LS(Linear Sum)각 데이터의 선형 합을 진행하고, 각 샘플 1차원 좌표의 합을 해줌.
- SS(Squared Sum)각 좌표의 제곱의 합을 계산
- 그 다음 거리를 계산 R (Radius)
( ⇒ 편 가르기와 비슷하다고 생각하면 쉽다.)
- 주의할점
- 내가 수집한 데이터 피처가 2개라고 해서 2개를 다 돌리는게 아니라, EDA나 모델을 통해 중요 변수를 선택한다음에 다시 클러스터링 해도 됨.(물론 2개 다 돌려도 되긴함)
- 거리 계산이다보니, 피처마다의 크기를 신경써야 한다.
- 예) 하나는 0.3 인데, 하나는 2000 이러면 곤란함 → 이 경우 정규화를 하여 처리할 것
클러스터링 정리
- 클러스터링은 정답이 없는 것을 재주껏 내가 정답을 만드는 과정이다.
- 모든 알고리즘은 거리를 중심으로 계산하기 때문에 → 특징들의 값들의 대역을 신경써야한다 ⇒ 예를들어, 정규화를 거친 값의 분포 조정 등
- 모든 컬럼의 특징을 기준으로 삼아 할 수도 있지만, 내가 EDA나 지식을 통해 특정 컬럼만 가지고 진행하는 것이 좋다. 모델을 기반으로 중요 변수만 가지고 해도 가능. (정답은 없기 때문에 그때그때 상황에 따라 다르다, 모든 것이 예제처럼 예쁘게 구별되는 경우가 거의 없다.)
- 각 그룹에 대한 특징을 규정하는 것이 중요할 것이다.
⇒ EDA, 모델, 클러스터, 규칙: 하나의 도구들일 뿐이라고 접근하여 진행하는 것이 수월할 것이다.
Optuna
- 최적의 파라미터 찾는 HPT: Ray-Tune, Bayseain-Scikitlearn, Optuna
- 여러 플랫폼 중에서 optuna인 이유 : 기존의 HyperParameterOptimization의 여러 방식들의 장점을 결합하여 제시한 방법론 + 시각화 기능까지 Add On
- Bayseian을 기반으로 한다.
- 사용방법 2가지
- 방법1 - 사전 설계 형 모델 사용: 특별하게 우리가 찾을 범위를 지정하지 않고, 자체적으로 지정되어 있어서 그냥 돌리기만 하면 됨. 기본적인 설정을 전혀 건드릴 수 없다는 단점이 존재함
- 방법2 - 구체적으로 우리가 설정하는 모델 : 우리가 지정을 직접 하면서 직접 설정하는 HPO방식
- 구체적으로 수치를 입력하는것이 아닌 범위를 입력하여서 돌리는 방식
- 설치
- 코랩에서는 optuna만 설치하면되지만
- 로컬에서는 plotly를 먼저 설치 후에 optuna를 설치해야함.
- ⇒ 코랩에는 plotly가 설치되어 있기때문
- 기본과정
- 하이퍼 파라미터 값 변경 → 모델 학습 → 모델 검증 → 별로면 다시 반복 진행
- 파라미터 확인하기
- optuna홈페이지 - Docs - API reference - optuna.trial - optuna.trail.Trial - Method 표를 보면 확인할 수 있음
- https://optuna.readthedocs.io/en/stable/reference/generated/optuna.trial.Trial.html#optuna.trial.Trial
- optuna를 사용할 때 알아야 할 것
- 스스로 '목적 함수'를 만들어야 한다.
def objective(trail):
# 개별 실행/test를 바탕으로 무엇을 할지!
# 실수를 입력받는 메서드 : .suggest_float
x = trail.suggest_float("x", -10, 10)
return (x-2)
study = optuna.create_study()
# n_trails = 몇번 공부할건지 / 공부 = 최적값을 찾는 것
study.optimize(objective, n_trials=100 )
study.best_params
Optuna 실습
타이타닉 데이터에 Optuna 사용해보기
- optuna외에도 sklearn 같이 사용
- scikit-learn의 파라미터인 n_estimators 는 정수형을 받아드리므로 optuna에서도 정수형을 불러 사용
# 패키지 부르기
import pandas as pd
import numpy as np
from sklearn.preprocessing import LabelEncoder
# 데이터 부르기
path = "/content/drive/MyDrive/titanic_train.csv"
data = pd.read_csv(path)
data.head()
이전에 진행한 기본적인 EDA와 RF모델 생성
# 결측치 채우는 함수
def check_fillna( df ):
df.loc[:, "Age"].fillna( df.loc[:,"Age"].mean(), inplace=True)
df.loc[:, "Cabin"].fillna( "N", inplace=True)
df.loc[:, "Embarked"].fillna("N", inplace=True)
return df
# 불필요 피쳐 삭제
def drop_features( df ):
df.drop( [ "PassengerId", "Name", "Ticket"], axis=1, inplace=True)
return df
# 각 문자열 행 라벨인코딩
def encode_features(df):
df.loc[:,"Cabin"] = df.loc[:,"Cabin"].apply(lambda x: str(x)[:1])
cols = ["Cabin", "Sex","Embarked"]
for col in cols:
le = LabelEncoder()
le.fit(df.loc[:, col])
df.loc[:, col] = le.transform(df.loc[:, col])
return df
def titanic_preprocessing(df):
df = check_fillna(df)
df = drop_features(df)
df = encode_features(df)
return df
# 정답지 분리 후 삭제
y_titanic = data.loc[:, "Survived"]
X_titanic = data.drop( "Survived", axis= 1)
X_titanic.head()
# 전처리 함수 적용
X_titanic = titanic_preprocessing( X_titanic)
X_titanic.info()
from sklearn.model_selection import train_test_split
# 비율 맞춰서 학습 데이터와 테스트 데이터를 분리
X_train, X_val, y_train, y_val = train_test_split(
X_titanic, # 문제
y_titanic, # 정답지
test_size= 0.2, # 얼마나 자를것인지
random_state=1234, # 재현성 위한 시드값
stratify= y_titanic
)
from sklearn.model_selection import KFold
# StratifiKFold
kfold = KFold(n_splits=5, random_state=1234, shuffle=True)
kfold
from sklearn.model_selection import cross_val_score
from sklearn.metrics import accuracy_score
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(n_jobs=-1, random_state=1234)
scores = cross_val_score( rf,
X_train,y_train,
cv= kfold,
scoring="accuracy",
)
for iter_count, acc in enumerate(scores):
print("RF의 {0}번째 검증 ACC:{1:4f}".format(iter_count, acc ))
print("RF 모델의 Accuracy Mean:", scores.mean())
print("RF 모델의 Accuracy std:", scores.std())
Optuna 적용하여 RF 모델 작성
def rf_objective(trail):
#1) Test할 파라미터들에 대한 가변적 범위 설정
params = {
"n_estimators" : trail.suggest_int("n_estimators", 100, 5000),
"criterion" : trail.suggest_categorical("criterion", ["gini", "entropy", "log_loss"]),
"max_depth" : trail.suggest_int("max_depth", 1, 100),
"min_sample_leaf" : trail.suggest_int("min_sample_leaf", 1, 20),
"max_features" : trail.suggest_int("max_features", 1, X_train.shape[1]),
"max_leaf_nodes": trail.suggest_int("max_leaf_nodes", 2, 1000)
}
#2) 1번에서 테스트할 파라미터를 받아줄 함수 -> 모델
rf = RandomForestClassifier(n_jobs=-1, random_state=1234, **params)
#3 모델에 대해서 일단 학습(중간 확인용)
rf.fit(X_train, y_train)
#4) CV+ 평가지표: 기존에 scikit-learn, 필요한 여러 패키지를 활용 가능함
scores = cross_val_score(rf, X_train, y_train, cv=kfold, scoring='accuracy')
acc_mean = scores.mean()
#5) OPT: 어떤 값을 최적화를 할지에 대한 Target
return acc_mean
# 학습 방향 설정
rf_study = optuna.create_study(direction="maximize")
# 실제 학습
rf_study.optimize(rf_objective, n_trials = 50, n_jobs=-1)
학습된 결과들에 대해 제일 좋았던 결과와 파라미터 출력
print(rf_study.best_params)
print(rf_study.best_trial.values)
# 결과
{'n_estimators': 1935, 'criterion': 'log_loss', 'max_depth': 64,
'min_samples_leaf': 5, 'max_features': 2, 'max_leaf_nodes': 729}
[0.832817886339013]
optuna의 특징 중 하나는 테스트 결과를 plotly 기반으로 시각화할 수 있다.
# 시각화 1 : 학습 진행 관련
optuna.visualization.plot_optimization_history(rf_study)
# 시각화 2: 중요한 변수들의 범위
optuna.visualization.plot_parallel_coordinate(rf_study)
# 시각화 3: target에 영향을 미친 변수 확인
optuna.visualization.plot_param_importances(rf_study)
제일 좋았던 파라미터들에 대한 모델이 없다면 재학습을 진행한다.
방법1 ) 직접 내가 하나씩 설정
opt_rf = RandomForestClassifier(
n_jobs=-1, random_state=1234,
n_estimators = rf_study.best_params["n_estimators"],
criterion = rf_study.best_params["criterion"]
)
방법2) dict를 바로 파라미터로 설정
opt_rf = RandomForestClassifier(n_jobs=1, random_state=1234, **rf_study.best_params)
opt_rf.fit(X_train, y_train)
# val 평가
accuracy_score(y_val, opt_rf.predict(X_val))
# 출력 결과
0.8324022346368715
참고) 변수의 중요도 확인
# Tree 모형 중에서 각 변수의 중요도
opt_rf.feature_importances_
import matplotlib.pyplot as plt
# 시각화 방법 1
plt.barch(X_train.columns, opt_rf.feature_importances_)
# 시각화 방법 2 : 중요한 변수 순서대로 정렬 위해 DF 사용
temp = pd.DataFrame(
{
"FI": opt_rf.feature_importances_
},
index = list(X_train.columns)
)
temp.sort_values(by="FI").plot(kind="barh")
'ASAC 빅데이터전문가과정 > ML' 카테고리의 다른 글
Linux 실습 환경 만들기 / VirtualBox, Ubuntu 설치 (0) | 2024.08.30 |
---|---|
ASAC 40일차_머신러닝 8일차 (0) | 2024.08.30 |
ASAC 36일차_머신러닝 6일차 (0) | 2024.08.24 |
ASAC 35일차_머신러닝 5일차 (0) | 2024.08.22 |
ASAC 34일차_머신러닝 4일차 (0) | 2024.08.21 |