자격증/AICE

AICE Associate 정리

vy00 2024. 7. 10. 18:11

기본 라이브러리 임포트

#데이터 조작 및 분석을 위한 라이브러리 [데이터 읽기 및 쓰기/ 데이터 정리 및 변환/ 결측치 처리/ 데이터 통계 및 요약]
import pandas as pd 

#수치 계산을 위한 라이브러리 [배열 생성 및 조작(1차원, 2차원, 다차원 배열)/ 선형 대수 등 과학 계산/ 배열 간의 빠른 연산
import numpy as np

#기본적인 데이터 시각화를 위한 라이브러리
import matplotlib.pyplot as plt

#데이터 시각화를 위한 라이브러리로 Matplotlib를 기반으로 한다.
!pip install seaborn #seabon은 설치필요
import seaborn as sns

#다양한 머신러닝 알고리즘과 도구를 제공. 데이터 전처리, 모델 선택, 모델 평가 등 머신러닝 워크플로우의 대부분 지원
#Scikit-Learn 패키지는 sklearn이라는 이름으로 임포트
import sklearn

 

데이터 불러오기

#괄호안에 파일명 작성하기
df = pd.read_csv('')   #csv파일 읽어오기
df = pd.read_excel('') #excel파일 읽어오기
dj = pd.read_json('')  #json파일 읽어오기
dx = pd.read_xml('')   #xml파일 읽어오기

 

데이터 탐색하기

#col(열-세로), row(행-가로) 인덱스는 데이터프레임의 행을 고유하게 식별하는 레이블
df.head()    #처음 5개 행을 출력
df.tail()    #마지막 5개 행을 출력
df.info()    #데이터프레임의 요약 정보를 출력
df.describe()#데이터프레임의 기술 통계 요약을 출력
df.index     #데이터프레임의 인덱스 반환 
df.columns   #데이터프레임의 열 레이블 반환
df.values    #데이터프레임의 값을 numpy 배열 형태로 반환
df.shape     #데이터프레임 행, 열 개수 확인
df.isnull().sum() #Null인 데이터 확인. 단순히 isnull()만 사용하기도 하지만 sun()과 함께 사용되어 행이나 열별로의 Null 개수를 세기 위해 주로 사용

 

결측치(데이터셋에서 특정 값이 누락되거나 비어있는 경우) 확인하기

df.isna().sum()   #데이터프레임의 각 요소가 결측치인지 여부를 나타내는 불리언 값
df.isnull().sum() #각 열에서 결측치의 개수를 합산하여 반환

 

특정 열의 값들의 건수/비율 확인하기

df['A'].value_counts()

#normalize = True를 주면 정규화된 값으로 범주별 비율을 확인할 수 있습니다.
#df[열 이름].value_counts(normalize = False/True)
df['B'].value_counts(normalize=True) #normalize=True를 사용하면 이 빈도수를 전체 값의 비율로 변환

 

특정 열 삭제

#drop은 한 번에 행이나 열 중 하나만 삭제 가능

cols = ['A','B','C']
df = df.drop(cols, axis=1)
#또는
df.drop(cols, axis=1, inplace=True)

#'axis=1'은 열을 의미, 'axis=0'은 행을 의미
#'inplace=True'는 원본 데이터프레임을 직접 수정한다는 의미

 

 

결측치 대체

df.replace('변경전' ,'변경후', inplace=True )
#리스트 딕셔너리도 가능함
#replace: 주로 {'바꾸고자 하는 값': '바뀌는 값'}의 딕셔너리 형태로 주어집니다.
#inplace = True: 변수를 할당하지 않고 바로 적용할 수 있습니다.
df.replace( { '전':'후', '전2':'후2'  }, inplace=True  )

 

결측치 채우기

#'value'은 결측치를 대체할 값/ 'method'은 결측치를 채우는 방법/ 'axis'는 결측치를 채울 축.'0'은 행,  '1'd은 열
#'inplace'는 원본 데이터프레임을 수정할지 여부/ 'limit'는 결측치를 채울 최대 개수/ 'downcast'는 데이터 타입을 변경하여 메모리 사용량을 줄일 수 있다.
df.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None)

#데이터프레임의 모든 결측치를 'A'로 대체한다.
df.fillna('A')
df['열이름'].fillna('바뀌는 값', inplace = False/True) #inplace = True: 변수를 할당하지 않고 바로 적용할 수 있습니다.

#특정 열의 결측치를 지정된 값으로 대체한다. 'col1'의 결측치는 'A'로, 'col2'의 결측치는 'B'로.
df.fillna(value={'col1':'A','col2':'B'})

#결측치를 바로 다음 값으로 채운다. 
df.fillna(method='bfill')

#결측치를 바로 이전 값을로 채운다.
df.fillna(method='ffill')
#df는 데이터가 있는 변수명 예시이다. 

median() #중앙값을 계산한다. ex) df['col'].median()
max()    #최대값을 계산한다. ex) df['col'].max()
min()    #최소값을 계산한다. ex) df['col'].min()
std()    #표준편차를 계산한다. ex) df['col'].std()

df['age'].mode()[0] #최빈 값(데이터에서 가장 많이 발생하는 값을 의미) ex)most_frequent_age = df['age'].mode()[0]  => 변수에다가 저장해서 사용
df.interpolate() #컴퓨터가 알아서 결측치 바꾸기(보간법) ex)df_interpolated = df.interpolate() => 변수에다가 저장해서 사용

.dropna #결측치 있는 데이터 지우기 ex)df = df.dropna(subset=['sex_type'])
#subset 없이 dropna 사용 ex)df_no_subset = df.dropna()

 

데이터 타입에 따른 컬럼명

#df.select_dtypes(type)
#type: int, float, str 등의 원하는 데이터 타입의 열만 추출

#데이터프레임 df에서 데이터 타입이 object인 열을 선택하여 그 열 이름을 obj 변수에 저장
obj = df.select_dtypes(include='object').columns

#데이터프레임 df에서 데이터 타입이 object가 아닌 열을 선택하여 그 열 이름을 obj_x 변수에 저장
obj_x = df.select_dtypes(exclude='object').columns

 

데이터 타입 변환

#특정 열의 데이터 타입 변환 (데이터프레임에서 하나의 열만 선태가는 경우)
df['A'] = df['A'].astype(float) #'A' 열을 int에서 float로 변환

#선택된 열들의 데이터 타입 일괄 변환
cols = ['A', 'B']
df[cols] = df[cols].astype(float)

#열별로 다른 데이터 타입으로 변환
df = df.astype({'A': 'float', 'B': 'int'})



그룹 집계

#by: 그룹의 기준이 되는 열로 여러 열을 기준으로도 할 수 있다.
#as_index = bool: 그룹 기준 열을 인덱스화 할지 여부를 선택할 수 있다.
#집계함수: sum(합), mean(평균), count(개수) 등의 집계함수

df.groupby(by=['그룹기준 열'])['집계 대상 열'].집계함수()

# ex)'department' 열을 기준으로 'salary' 열의 합계 계산
grouped_sum = df.groupby(by=['department'])['salary'].sum()

 

라벨엔코딩 Label Encoding(범부형 데이터를 숫자형 데이터로 변환)

from sklearn.preprocessing import LabelEncoder

#LabelEncoder객체를 생성. 이 객체를 통해 데이터를 변환할 수 있다.
L_en = LabelEncoder()

#데이터프레임 df의 C열에 대해 라벨 인코딩을 수행하고, 변환된 결과를 다시 C열에 저장한다.
#df['범주형 열'] = le.fit_transform(df['범주형 열'])
df['C'] = L_en.fit_transform(df['C'])

 

원핫엔코딩 One-Hot Encoding (각 범주형 값을 이진 벡터로 변환하는 기법)

from sklearn.preprocessing import  OneHotEncoder
O_en = OneHotEncoder()
df['D'] = O_en.fit_transform(df['D'])


#다른 방법
#원-핫 인코딩은 pandas내의 메소드로 적용한다.

#columns: 원-핫 인코딩을 적용할 열 리스트
#drop_first=True: 첫번째 범주는 제외하고 원-핫 인코딩 적용.
df = pd.get_dummies(df, columns=['범주형 열'], drop_first=True)

 

get_dummies (One-Hot Encoding을 수행하는데 사용하는 라이브러리)

 cols = ['','']  #원핫인코딩을 수행할 열들의 이름을 리스트로 저장 ex) cols = ['color', 'size']
 df_dummy =  pd.get_dummies(df, columns=cols) #데이터프레임 df에서 cols 리스트에 지정된 열들을 원-핫 인코딩하여 df_dummy 데이터프레임에 저장
 
 #drop_first=True옵션도 있음.
 #이 옵션을 사용하면 첫 번째 더미 변수를 제거하여 다중 공선성 문제를 줄일 수 있습니다. 이는 각 범주의 첫 번째 값이 기준 값이 되어 나머지 값들이 이를 기준으로 인코딩됩니다.

 

 

특정타입 열들을 LabelEncoder 하는법

-모든 오브젝트(문자열) 열을 선택

object_columns = titanic.select_dtypes(include=['object','category'])

 

-모든 오브젝트(문자열) 열을 Label Encoding

for column in object_columns:
titanic[column] = label_encoder.fit_transform(titanic[column])

그래프

#히스토그램
#x는 히스토그램을 그릴 데이터 열 이름 지정/ hue는 색상으로 구분할 또 다른 열 이름 지정/ data는 데이터프레임 지정
# ex) sns.histplot(x='column_name', hue='another_column', data=df)
sns.histplot(x='', hue='',data=df)

#kde플롯 (데이터의 밀도 추정치를 나타내는 커널 밀도 추정 플롯을 그린다.)
#df['A']: KDE 플롯을 그릴 열을 지정합니다.
sns.kdeplot(df['A'])

#카운트 플롯(범주형 데이터의 빈도를 막대 그래프로 나타낸다.)
#x: 빈도를 세어 막대 그래프로 나타낼 범주형 열 이름을 지정합니다./ data: 데이터프레임 df를 지정합니다.
# ex) sns.countplot(x='column_name', data=df)
sns.countplot(x='', data=df)

# 막대그래프
#열 'A'의 값들을 세어 막대 그래프로 나타냅니다./ kind='bar': 막대 그래프의 유형을 지정합니다.
df['A'].value_counts().plot(kind='bar')

#히트맵
#df[['A', 'B', 'C']].corr(): 열 'A', 'B', 'C' 간의 상관 행렬을 계산합니다./ sns.heatmap(heat, annot=True, cmap='Blues'): 상관 행렬 heat을 히트맵으로 나타냅니다.
#annot=True: 각 셀에 상관 계수를 표시합니다./ cmap='Blues': 히트맵의 색상 팔레트를 지정합니다.
heat = df[['A','B','C']].corr()
#fmt='d 옵션을 사용하면 소수점이 없는 정수로 표시된다.

sns.heatmap( heat, annot=True, cmap='Blues' )
sns.heatmap(heat, annot=True, fmt='.2f', cmap='Blues') #소수점 형식으로 표시


#박스
#x: 박스 플롯의 x축에 표시할 범주형 열 이름을 지정합니다./ y: 박스 플롯의 y축에 표시할 연속형 열 이름을 지정합니다./ data: 데이터프레임 df를 지정합니다.
# ex) sns.boxplot(x='category_column', y='value_column', data=df)
sns.boxplot(x= '', y= '', data=df )

 


데이터 분리하기 (Pandas 라이브러리를 사용하여 데이터를 불러온 후, 립 변수(x_data)와 종속 변수(y_data)로 나누는 과정)

import pandas as pd

#CSV 파일로부터 데이터 읽기
data = pd.read_csv('') # ex)data = pd.read_csv('data.csv')

#독립 변수 (특징) 데이터 추출
#data.drop 함수는 target 열을 제외한 나머지 열들로 구성된 데이터프레임이 x_data에 저장
#target: 제거할 열의 이름/ axis=1: 열을 기준/ axis=0은 행을 기준
x_data = data.drop(target, axis = 1)

#종속 변수 (목표) 데이터 추출
#data.loc는 데이터프레임에서 특정 행과 열을 선택하는 인덱싱 방식
# :은 모든 행을 선택/ target 열을 선택
y_data = data.loc[:, target]

 

 


*머신러닝

 

데이터 분리하기

#scikit-learn 라이브러리의 train_test_split 함수사용
#학습용(train)과 테스트용(test)으로 분할하는 과정
from sklearn.model_selection import train_test_split

#train_test_split 함수는 입력된 데이터셋을 학습용 데이터와 테스트용 데이터로 분할
# ex)x_train, x_test, y_train, y_test = train_test_split(x_data, y_data, test_size=0.2, stratify=None, random_state=42)

# test_size: 테스트용 데이터셋의 비율 또는 개수. 예를 들어, test_size=0.2는 전체 데이터의 20%를 테스트용으로 사용함을 의미
#train_size/test_size: 학습용/검증용 데이터를 분할할 기준이 된다. (주로 8:2나 7:3으로 분할한다.)

# 층화 표본 추출 방법으로, 분할 전 y_data의 클래스 비율을 유지합니다. 주로 분류 문제에서 사용
# 데이터 분할 시 난수 시드(seed)를 지정하여 분할 결과를 재현 가능하게 합니다. 예를 들어, random_state=42는 난수 시드를 42로 설정하여 동일한 데이터 분할 결과를 얻을 수 있다.

x_train,x_test, y_train,y_test = train_test_split(x_data, y_data,test_size=, stratify=y_data, random_state= )

 

데이터 표준화/ 정규화

# 2개 중 하나만 골라서 쓰기

# 데이터의 최소값과 최대값을 사용하여 모든 값을 0과 1 사이로 변환

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
x_train = scaler.fit_transform(X_train) # fit: 기준이 되는 데이터를 기반으로 스케일러 값을 맞춘다.
x_test = scaler.transform(X_test) #transform: 기준 값을 기반으로 스케일링을 적용한다.
#데이터의 평균과 표준편차를 사용하여 모든 값을 평균 0, 표준편차 1로 변환

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
x_train = scaler.fit_transform(X_train)
x_test = scaler.transform(X_test)

 

머신러닝 모델링

=>머신러닝은 분류와 회귀 유형이 있다.

분류는 입력 데이터를 미리 정의된 여러 클래스 중 하나로 분류하는 것

예시: 이메일이 스팸인지 아닌지 분류하기, 손글씨 숫자 인식, 질병 진단 등.

모델은 아래와 같다.

  • 로지스틱 회귀 (Logistic Regression)
  • 결정 트리 (Decision Tree)
  • 랜덤 포레스트 (Random Forest)
  • 서포트 벡터 머신 (SVM)
  • K-최근접 이웃 (K-Nearest Neighbors, KNN)
  • 신경망 (Neural Networks)

 

회귀는 입력 데이터를 기반으로 연속적인 숫자 값을 예측하는 것이다.

예시: 주택 가격 예측, 주식 가격 예측, 온도 예측 등.

모델은 아래와 같다.

 

 

  • 선형 회귀 (Linear Regression)
  • 다항 회귀 (Polynomial Regression)
  • 결정 트리 회귀 (Decision Tree Regression)
  • 랜덤 포레스트 회귀 (Random Forest Regression)
  • 서포트 벡터 회귀 (Support Vector Regression, SVR)

 

머신러닝 분류

1) 분류 라이브러리 & 모델선언

#주어진 여러 모델 중 하나를 선택해서 해당 모델을 사용할 수 있도록 초기화

#Logistic Regression : 이진 분류(Binary Classification) 문제에서 주로 사용되는 모델로, 데이터가 특정 클래스에 속할 확률을 예측
# 선형 모델로, 입력 변수들의 선형 결합에 기반하여 예측을 수행
# ex)model = LogisticRegression(max_iter=100, C=1.0)
# max_iter: 최대 반복 횟수. 일반적으로 100이나 200을 사용
# C: 정규화 강도. 기본값은 1.0이며, 값이 작을수록 강한 정규화를 의미

from sklearn.linear_model import LogisticRegression
model = LogisticRegression(max_iter= ,  C= )


#K-Nearest Neighbors : 주어진 데이터 포인트에서 가장 가까운 k개의 이웃을 찾아 다수결 원칙에 따라 분류하는 모델
#비선형 모델로, 새로운 데이터 포인트의 클래스를 결정하기 위해 훈련 데이터와의 거리를 측정
# ex) model = KNeighborsClassifier(n_neighbors=5)
# n_neighbors: 사용할 이웃의 수. 기본값은 5

from sklearn.neighbors import KNeighborsClassifier
moedel = KNeighborsClassifier(n_neighbors=)


#데이터를 여러 기준으로 분할하여 트리 구조를 형성하는 모델입니다. 각 노드는 특정 기준에 따라 데이터를 분류
# ex)model = DecisionTreeClassifier(max_depth=5, random_state=42)
#max_depth: 트리의 최대 깊이. 과적합을 방지하기 위해 설정
#random_state: 결과의 재현성을 위해 설정하는 난수 시드. 예를 들어, 42를 자주 사용

from sklearn.tree import DecisionTreeClassifier
model = DecisionTreeClassifier(max_depth=, random_state=)


#여러 개의 Decision Tree를 결합하여 예측 성능을 향상시키는 앙상블 모델
# ex)model = RandomForestClassifier(n_estimators=100, random_state=42)
#n_estimators: 사용할 트리의 수. 일반적으로 100에서 200 사이의 값을 사용
#random_state: 결과의 재현성을 위해 설정하는 난수 시드

from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier(n_estimators=, random_state=)


#Gradient Boosting 알고리즘을 기반으로 한 고성능 앙상블 학습 모델
# ex)model = XGBClassifier(n_estimators=100)
#n_estimators: 부스팅 단계의 수. 일반적으로 100에서 1000 사이의 값을 사용

from xgboost import XGBClassifier
model = XGBClassifier(n_estimators= )


#Gradient Boosting 알고리즘을 기반으로 한 고성능 앙상블 학습 모델로, 대규모 데이터셋에서 효율적으로 학습할 수 있도록 설계
#model = LGBMClassifier(n_estimators=100)
#n_estimators: 부스팅 단계의 수. 일반적으로 100에서 1000 사이의 값을 사용

from lightgbm import LGBMClassifier
model = LGBMClassifier(n_estimators=)

 

2) 분류 모델학습

: 머신러닝 모델을 학습시키기위해 사용하는 코드

#fit 메서드는 학습데이터를 사용하여 모델 학습시킴
model.fit(X_train, y_train)


3) 분류 성능평가

-필요한 라이브러리 임포트

-모델 예측

-평가 지표 계산 및 출력

from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score #정확도, 정밀도, 재현율, f1점수 계산
from sklearn.metrics import confusion_matrix  #혼동 행렬 생성
from sklearn.metrics import classification_report #정밀도, 재현율, F1 점수를 포함한 종합적인 분류 성능 보고서 출력

#모델 예측
#학습된 모델을 사용하여 테스트 데이터(x_test)에 대한 예측을 수행하고, 예측 결과를 y_pred에 저장
y_pred = model.predict(x_test)

#결과
print(accuracy_score(y_test, y_pred))
print(recall_score(y_test, y_pred))
print(precision_score(y_test, y_pred))

 

4)분류 히트맵 ( 혼동 행렬(confusion matrix)을 계산하고, 이를 히트맵으로 시각화하는 과정을 보여준다.)

혼동 행렬은 분류 모델의 성능을 평가하는 데 중요한 도구로, 각 클래스의 예측 결과를 요약합니다.

히트맵을 통해 혼동 행렬의 값을 시각적으로 쉽게 이해할 수 있습니다.

#confusion_matrix 함수는 실제 값(y_test)과 예측 값(y_pred)을 비교하여 혼동 행렬을 생성
heat = confusion_matrix(y_test, y_pred)

#seaborn 라이브러리의 heatmap 함수를 사용하여 혼동 행렬을 히트맵으로 시각화
#heat: 시각화할 혼동 행렬./ annot=True: 각 셀에 값을 표시/ fmt='d': 값을 정수 형태로 표시/ cmap='Blues': 히트맵의 색상 팔레트를 'Blues'로 설정
sns.heatmap(heat, annot=True, fmt='d',color='Blues')
plt.show()

머신러닝 회귀

1)회귀 라이브러리 & 모델 선언

#주어진 여러 모델 중 하나를 선택해서 해당 모델을 사용할 수 있도록 초기화

# 선형 회귀는 종속 변수와 하나 이상의 독립 변수 간의 선형 관계를 모델링
from sklearn.linear_model import LinearRegression
model = LinearRegression(  )


## 데이터 포인트의 k개의 최근접 이웃을 사용하여 예측값을 계산
#ex) model = KNeighborsRegressor(n_neighbors=5)
#n_neighbors: 이웃의 수.

from sklearn.neighbors import KNeighborsRegressor
moedel = KNeighborsRegressor(n_neighbors=)


#데이터를 여러 분할 기준으로 나누어 트리 구조를 형성
#ex) model = DecisionTreeRegressor(max_depth=5, random_state=42)
#max_depth: 트리의 최대 깊이. 과적합을 방지하기 위해 설정
#random_state: 결과의 재현성을 위해 설정하는 난수 시드.

from sklearn.tree import DecisionTreeRegressor
model = DecisionTreeRegressor()

#여러 개의 결정 트리를 결합하여 예측 성능을 향상
# ex)model = RandomForestRegressor(n_estimators=100, random_state=42)
#n_estimators: 트리의 수. 일반적으로 100을 사용
#random_state: 결과의 재현성을 위해 설정하는 난수 시드.

from sklearn.ensemble import RandomForestRegressor
model = RandomForestRegressor()


#Gradient Boosting 알고리즘을 사용한 고성능 회귀 모델
# ex) model = XGBRegressor(n_estimators=100)
# n_estimators: 부스팅 단계의 수.

from xgboost import XGBRegressor
model = XGBRegressor( )

#Gradient Boosting 알고리즘을 사용한 고성능 회귀 모델로, 특히 대규모 데이터셋에서 효율적
# ex) model = LGBMRegressor(n_estimators=100)
#n_estimators: 부스팅 단계의 수.

from lightgbm import LGBMRegressor
model = LGBMRegressor()

 

2) 회귀 학습

model.fit(X_train, y_train)

 

3) 모델 검증

생성된 모델의 성능을 평가한다.
분류 모델은 정확도로, 회귀 모델은 결정계수로 검증한다.
# 모델 검증
model.score(X_test, y_test)

 

4) 회귀 성능평가

from sklearn.metrics import mean_squared_error, mean_absolute_error,r2_score

y_pred = model.predict(x_test)

#결과
print(mean_squared_error(y_test, y_pred, squared=False)) # RMSE(예측값과 실제 값의 평균적인 차이를 루트 씌운 값)를 반환
print(mean_absolute_error(y_test, y_pred)) #MAE(예측값과 실제 값의 절대적인 평균 차이)
print(r2_score(y_test, y_pred)) # R^2 Score(모델이 데이터의 분산을 얼마나 잘 설명하는지)


# 회귀계수 = 가중치 확인 : 
model.coef_

# 편향(y절편) 
model.intercept_

 

*머신러닝 모델링 정리

 

LogisticRegression
Logistic Regression을 사용하기 위해서는 로드하는 과정이 필요하다.

  • C: 규제 강도
  • max_iter: 반복 횟수
# import
from sklearn.linear_model import LogisticRegression

# 모델 생성
lg = LogisticRegression(C=1.0, max_iter=1000)

# 모델 학습
lg.fit(X_train, y_train)

# 모델 평가
lg.score(X_test, y_test)

 

DecisionTreeClassifier / DecisionTreeRegressor
Decision Tree를 사용하기 위해서는 로드하는 과정이 필요하다.

  • max_depth: 트리 깊이
  • random_state: 랜덤 시드
# import
from sklearn.tree import DecisionTreeClassifier # 분류
from sklearn.tree import DecisionTreeRegressor # 회귀

# 모델 생성
dt = DecisionTreeClassifier(max_depth=5, random_state=2023)

# 모델 학습
dt.fit(X_train, y_train)

# 모델 평가
dt.score(X_test, y_test)

 

RandomForestClassifier / RandomForestRegressor
Random Forest를 사용하기 위해서는 로드하는 과정이 필요하다.

  • n_estimators: 사용하는 트리 개수
  • random_state: 랜덤 시드
# import
from sklearn.ensemble import RandomForestClassifier # 분류
from sklearn.ensemble import RandomForestRegressor # 회귀

# 모델 생성
rf = RandomForestClassifier(n_estimators=100, random_state=2023)

# 모델 학습
rf.fit(X_train, y_train)

# 모델 평가
rf.score(X_test, y_test)

 

XGBClassifier / XGBRegressor
XGBoost를 사용하기 위해서는 설치 및 로드하는 과정이 필요하다.

  • n_estimators: 사용하는 트리 개수
# install
!pip install xgboost

# import
from xgboost import XGBClassifier # 분류
from xgboost import XGBRegressor # 회귀

# 모델 생성
xgb = XGBClassifier(n_estimators=100)

# 모델 학습
xgb.fit(X_train, y_train)

# 모델 평가
xgb.score(X_test, y_test)

 

LGBMClassifier / LGBMRegressor
Light GBM을 사용하기 위해서는 설치 및 로드하는 과정이 필요하다.

  • n_estimators: 사용하는 트리 개수
# install
!pip install lightgbm

# import
from lightgbm import LGBMClassifier # 분류
from lightgbm import LGBMegressor # 회귀

# 모델 생성
lgbm = LGBMClassifier(n_estimators=100)

# 모델 학습
lgbm.fit(X_train, y_train)

# 모델 평가
lgbm.score(X_test, y_test)

 

머신러닝 최적화 

1. 모델 불러오기 & 그리드서치 & 성능평가

# import 
from sklearn.metrics import * # 모든 함수 로드

# 불러오기
from sklearn.linear_model import LinearRegression
from sklearn.neighbors import KNeighborsRegressor
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import RandomForestRegressor
from xgboost import XGBRegressor
from lightgbm import LGBMRegressor

from sklearn.model_selection import cross_val_score, GridSearchCV
from sklearn.metrics import mean_absolute_error, r2_score

 

1) Linear regression

# 선언하기
model = LinearRegression()
# 성능예측
cv_score = cross_val_score(model, x_train, y_train, cv=5) #cv=5: 교차 검증에서 사용할 폴드(fold)의 수. 여기서는 5-fold 교차 검증을 의미
# 결과확인
print('평균:', cv_score.mean())

# 결과수집
result = {}
result['Linear Regression'] = cv_score.mean()

 

 

2) KNN (주어진 데이터 포인트에서 가장 가까운 k개의 이웃을 찾아 다수결 원칙에 따라 분류하는 모델)

# 선언하기
model = KNeighborsRegressor()
# 성능예측
cv_score = cross_val_score(model, x_train_s, y_train, cv=5)
# 결과확인
print('평균:', cv_score.mean())
# 결과수집
result['KNN'] = cv_score.mean()

 

3) Decision Tree (데이터를 여러 분할 기준으로 나누어 트리 구조를 형성)

# 선언하기
model = DecisionTreeRegressor(random_state=1)
# 성능예측
cv_score = cross_val_score(model, x_train, y_train, cv=5)
# 결과확인
print('평균:', cv_score.mean())
# 결과수집
result['Decision Tree'] = cv_score.mean() 

 

4) RandomForest (여러 개의 결정 트리를 결합하여 예측 성능을 향상)

# 선언하기
model = RandomForestRegressor(random_state=1)
# 성능예측
cv_score = cross_val_score(model, x_train, y_train, cv=5)
# 결과확인
print('평균:', cv_score.mean())
# 결과수집
result['Random Forest'] = cv_score.mean()

 

5) XGBoost (Gradient Boosting 알고리즘을 사용한 고성능 회귀 모델)

# 선언하기
model = XGBRegressor(random_state=1)
# 성능예측
cv_score = cross_val_score(model, x_train, y_train, cv=5)
# 결과확인
print('평균:', cv_score.mean())
# 결과수집
result['XGBoost'] = cv_score.mean()

 

6) LightGBM (Gradient Boosting 알고리즘을 사용한 고성능 회귀 모델로, 특히 대규모 데이터셋에서 효율적)

# 선언하기
model = LGBMRegressor(random_state=1, verbose=-100)
# 성능예측
cv_score = cross_val_score(model, x_train, y_train, cv=5)
# 결과확인
print('평균:', cv_score.mean())
# 결과수집
result['LightGBM'] = cv_score.mean()

 

2. 모델들의 성능 평가하기

# 성능 비교
print('=' * 40)
for m_name, score in result.items():
    print(m_name, score.round(3)) #score.round(3): 성능 점수를 소수점 셋째 자리에서 반올림하여 출력
print('=' * 40)

##시각화
# 성능 시각화 비교
plt.barh(list(result.keys()), result.values())
plt.show()

 

3. 성능 튜닝하기

-위에서 성능이 가장 좋은 모델을 가지고 튜닝 한다.

# 기본 모델 선언
model_rfr = RandomForestRegressor(random_state=1)

# 파라미터 지정
  # max_depth: range(1, 21) max_depth: 랜덤 포레스트의 각 결정 트리의 최대 깊이를 설정합니다. 여기서는 1부터 20까지의 값을 시도
param = {'max_depth': range(1, 21)}

# 모델 선언
model = GridSearchCV(model_rfr,
                     param,
                     cv=5,
                     scoring='r2')
                     
# 변수 중요도 시각화
plt.figure(figsize=(6, 5)) #그래프의 크기를 설정합니다. 가로 6인치, 세로 5인치로 설정
plt.barh(list(X.columns), model.best_estimator_.feature_importances_) #수평 막대 그래프를 그린다.
plt.xlabel('Feature Importance') #x축 레이블 설정
plt.ylabel('Features') #y축 레이블 설정
plt.title('Feature Importance in Random Forest') #그래프 제목 설정
plt.show()
                     
# 학습하기 (시간 많이 걸릴수도 있다용)
model.fit(x_train, y_train)

#최적의 파라미터와 성능 확인
print("최적의 파라미터:", model.best_params_)
print("최고 성능 (R^2):", model.best_score_)

 

4. 최적 파라미터가 적용된 모델의 성능 평가

# 예측하기
y_pred = model.predict(x_test)

# 성능평가
print(mean_absolute_error(y_test, y_pred))
print(r2_score(y_test, y_pred))

딥러닝 모델링

 

주로 Sequential한 방법으로 레이어를 쌓는 문제가 나온다고 한다.

example 
# 첫번째 레이어 - unit: 128, activation: relu, input_shape: (26,)
# 두번째 레이어 - unit: 64, activation: relu
# 세번째 레이어 - unit: 32, activation: relu
# 각 히든 레이어 사이에는 0.3비율의 Dropout 적용
# 아웃풋 레이어 - activation: sigmoid

# import
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout

# 모델 생성
model = Sequential()

# 모델 구조
model.add(Dense(128, input_shape=(26,), activation='relu'))
model.add(Dropout(.3))
model.add(Dense(64, activation='relu'))
model.add(Dropout(.3))
model.add(Dense(32, activation='relu'))
model.add(Dropout(.3))
# output layer의 unit 수는 타겟 변수의 범주 개수와 동일하다.
model.add(Dense(1, activation='sigmoid')) 

# 모델 요약
model.summary()

 

라이브러리 블러오기

import tensorflow as tf
from tensorflow import keras

from tensorflow.keras.models import Sequential, load_model, Model
from tensorflow.keras.layers import Dense, Dropout,Input,Activation, BatchNormalization,Flatten
from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint
from tensorflow.keras.utils import to_categorical

from tensorflow.keras.backend import clear_session
clear_session()

 

x_train :모델 입력값 확인하기

x_train.shape

 

y_train :  아웃풋값 확인하기

y_train.shape

 

1) DNN모델링

1. model = Sequential() 의미: Keras 라이브러리에서 Sequential 모델을 생성합니다. Sequential 모델은 레이어를 하나씩 순차적으로 쌓아가는 방식으로 신경망을 구성합니다.

 

2. model.add(Dense(4, input_shape=(3,), activation='relu')) Dense(4): 4개의 뉴런을 가진 Dense(완전 연결) 레이어를 추가합니다. input_shape=(3,): 입력 데이터의 형태를 정의합니다. 여기서 입력 데이터는 3개의 특성을 가집니다. activation='relu': ReLU(Rectified Linear Unit) 활성화 함수를 사용합니다. ReLU 함수는 음수를 0으로 변환하고 양수를 그대로 통과시키는 함수입니다.

 

3. model.add(Dropout(0.2)) Dropout(0.2): Dropout 레이어를 추가합니다. 드롭아웃은 과적합을 방지하기 위해 학습 중에 무작위로 20%의 뉴런을 비활성화합니다.

 

4. model.add(Dense(4, activation='relu')) Dense(4): 또 다른 4개의 뉴런을 가진 Dense 레이어를 추가합니다. activation='relu': ReLU 활성화 함수를 사용합니다.

 

5. model.add(Dense(1, activation='sigmoid')) Dense(1): 출력 레이어로 1개의 뉴런을 가진 Dense 레이어를 추가합니다. activation='sigmoid': 시그모이드 활성화 함수를 사용합니다. 이 함수는 출력값을 0과 1 사이로 변환하여 이진 분류 문제에 적합합니다.

 

6. model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) loss='binary_crossentropy': 손실 함수를 이진 교차 엔트로피로 설정합니다. 이 함수는 이진 분류 문제에서 사용됩니다. optimizer='adam': Adam 옵티마이저를 사용합니다. Adam은 모멘텀과 RMSProp의 장점을 결합한 옵티마이저로, 학습 속도와 정확도를 높이는 데 도움을 줍니다. metrics=['accuracy']: 모델의 평가 기준으로 정확도를 사용합니다.

 

7. history = model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=40, batch_size=10) X_train, y_train: 학습 데이터와 레이블을 모델에 제공합니다. validation_data=(X_test, y_test): 검증 데이터와 레이블을 제공합니다. 모델의 성능을 평가하는 데 사용됩니다. epochs=40: 전체 데이터셋에 대해 40번 학습을 반복합니다. batch_size=10: 한 번에 10개의 샘플을 학습에 사용합니다. 즉, 배치 크기를 10으로 설정합니다. 추가 설명 모델 구조 Input Layer: 입력 데이터의 형태를 정의합니다. 여기서는 3개의 특성을 가진 입력 데이터를 받습니다. Hidden Layers: 두 개의 은닉층을 가지며, 각각 4개의 뉴런으로 구성됩니다. 활성화 함수로 ReLU를 사용하여 비선형성을 모델에 추가합니다. Dropout Layer: 과적합을 방지하기 위해 은닉층 사이에 드롭아웃 레이어를 추가합니다. Output Layer: 최종 출력 레이어는 하나의 뉴런을 가지며 시그모이드 활성화 함수를 사용하여 이진 분류 문제를 해결합니다.

 

 

-모델학습 설명

compile
딥러닝은 머신러닝과 달리 모델링 과정에서 컴파일이 필요하다.

  • optimizer: 모델링을 최적화하는 방법. 주로 Adam을 사용한다.
  • loss: 손실함수 - 타겟변수에 맞는 손실함수를 사용해야 한다.
    • 회귀: mse
    • 이진분류: binary_crossentropy
    • 다중분류: sparse_categorical_crossentropy, categorical_crossentropy
  • metrics: 모니터링 지표로, 사용자 정의 함수를 사용할 수 있다. 모델의 성능을 평가할 때 사용할 지표를 정
    • 회귀: mse, rmse
    • 분류: accuracy
# 모델 컴파일
model.compile(optimizer='adam',
			  loss='binary_crossentropy', 
              metrics=['accuracy'])

 

EarlyStopping
모델의 과대적합을 방지하기 위해 학습이 개선되지 않는다면 학습을 종료시킨다.

  • monitor: 학습되는지 확인하는 기준
  • mode: 모델 최적화의 기준 - 최대화/최소화
  • patience: 모델 성능이 개선되지 않을때 지켜보는 횟수
# import
from tensorflow.keras.callbacks import EarlyStopping

es = EarlyStopping(monitor='val_loss',
				   mode='min')

 

ModelCheckpoint
모델을 학습하는 과정에서 일정한 간격으로 모델의 가중치를 저장하며 최적 모델을 선택한다.

  • filepath: 모델 저장 경로
  • monitor: 모니터링하는 지표
  • mode: 모델 최적화의 기준 - 최대화/최소화
  • verbose: 정보 표시 정도(0, 1, 2)
  • save_best_only=True: 가장 좋은 성능의 모델만 저장
# import
from tensorflow.keras.callbacks import ModelCheckpoint

mc = ModelCheckpoint('my_checkpoibnt.ckpt',
					 monitor='val_loss', 
                     mode='min', 
                     save_best_only=True)

 

fit
모델을 학습한다.

  • validation_data: 검증용 데이터.
    종속변수와 타겟변수의 쌍으로 입력해야 한다.
  • epochs: 학습 반복 횟수
  • batch_size: 학습 시 한 번에 학습하는 데이터 사이즈
  • callbacks: EarlyStopping, ModelCheckpoint와 같은 학습 과정에서 호출되는 함수
history = model.fit(X_train, y_train,
					validation_data = (X_test, y_test),
                    epochs=epochs,
                    batch_size=batch_size,
                    callbacks=[es, mc])

 

 

코드 결합 한 것

 

model = Sequential() #모델생성
model.add(Dense(64, activation='relu', input_shape=(x인풋값,)))
#model1.add(Flatten()) # 없어도 됨..
model.add(Dropout(0.25)) #학습 중 무작위로 25%의 유닛을 드롭한다. 과적합을 방지하기 위해 상ㅇ한다.
#model1.add( BatchNormalization( )) #없어도 됨..
model.add(Dense(아웃풋, activation='sigmoid')) # 2진분류,  다중분류= softmax

#조기 종료와 모델 체크포인트 콜백
#모델의 과대적합을 방지하기 위해 학습이 개선되지 않는다면 학습을 종료시킨다.
es = EarlyStopping( monitor='val_loss', 
                   patience=0, 
                   mode='min',
                   verbose=1 ) 
                 
#모델 체크포인트 콜백을 설정
#모델을 학습하는 과정에서 일정한 간격으로 모델의 가중치를 저장하며 최적모델 선택
ms = ModelCheckpoint( 'my_checkpoint.ckpt',  #모델 가중치를 저장할 파일명을 의미. best_model.h5의 경우에는
                     monitor='val_loss',
                     mode='min', 
                     verbose=1,   # verbose=True 옵션과 동일
                     save_weights_only=True,) #save_best_only 라고 해야 작동되었음

#모델 컴파일
model.compile(optimizer='adam', loss='binary_crossentropy') #이진분류 metrics=['accuracy']
#다중 분류의 경우  loss='sparse_categorical_crossentropy' #다중손실함수...
# 회귀는 loss='mse'

#모델 학습
history = model.fit(x_train, y_train, #학습 데이터와 레이블
                    epochs= 10, #학습할 에포크 수
                    batch_size= 32, #배치크기
                    validation_data=(x_test,y_test),
                    callbacks=[es,ms],
                    verbose=True
                   ).history

#모델의 구조를 요약하고 출력
model.summary()

 

2) 성능평가

#이진분류
y_pred = model.predict(x_test) #예측수행
y_pred_x = np.where(y_pred>=0.5, 1,0 ) # 0.5 이상의 확률값은 1로, 그 미만은 0으로 변환
print(classification_report(y_test, y_pred_x))

#다중분류
y_pred = model.predict(x_test) #예측수행
y_pred_x= np.argmax(y_pred,axis=1) #각 샘플에 대해 가장 높은 확률값을 가지는 클래스의 인덱스를 반환
print(classification_report(y_test, y_pred_x))

 

3) 학습/검정손실 그래프

history
모델 학습 과정에서 모델 학습 결과를 저장함으로써 학습 과정의 변화를 확인할 수 있다.
history는 딕셔너리 형태로 저장되어 key값으로 접근할 수 있다.

  • loss: 학습 loss.
  • val_loss: 검증 loss.
  • accuracy: 학습 accuracy.
  • val_accuracy: 검증 accuracy.
# 시각화 예시
plt.plot(history.history['loss'], label='Train Loss')
plt.plot(history.history['val_loss'], label='Validation Loss')
plt.xlabel('Epochs') 	# X축 라벨
plt.ylabel('Loss')		# Y축 라벨
plt.legend()			# 범례 표시 - label값
plt.show()

 

코드 결합한 

#history['loss']: Keras 모델 학습 시 기록된 학습 손실 값의 배열입니다. 각 에포크마다 계산된 손실 값이 저장
#label='Train_Loss': 범례에 표시될 라벨로, 학습 손실을 의미
plt.plot(history['loss'], label='Train_Loss')

#history['val_loss']: Keras 모델 학습 시 기록된 검증 손실 값의 배열입니다. 각 에포크마다 계산된 검증 손실 값이 저장
#label='Validation_Loss': 범례에 표시될 라벨로, 검증 손실을 의미
plt.plot(history['val_loss'], label='Validation_Loss')

#x축 레이블을 'Epochs'로 설정
plt.xlabel('Epochs')

#y축 레이블을 'Loss'로 설정
plt.ylabel('Loss')

#그래프에 범례 추가
plt.legend()
plt.show()

 

출처: https://datawithu.tistory.com/34 [Data_with_U:티스토리]

출처: https://velog.io/@sy508011/AICE-ASSOCIATE-%EC%9E%90%EA%B2%A9%EC%A6%9D-%EC%B7%A8%EB%93%9D%EC%9D%84-%EC%9C%84%ED%95%9C-%EC%B4%9D-%EC%A0%95%EB%A6%AC

 

 

'자격증 > AICE' 카테고리의 다른 글

AICE ex3  (1) 2024.07.12
AICE ex2  (0) 2024.07.12
AICE ex  (3) 2024.07.11