• 비지도학습
  1. 군집화 모델 - k-means clustering
  2. 군집화모델 - 계층적 군집화
  3. 군집화모델 - DBSCAN
  4. 차원축소 -  PCA
  5. 차원축소 - t-SNE
  6. 차원축소 - LDA
  • 앙상블 학습
  1. 배깅과 부스팅
  2. 랜덤 포레스트
  3. 그래디언트 부스팅 머신(GBM)
  4. XGBoost
  • GITHUB특강
  • 회고

 

☑️ 비지도학습 : 군집화모델 - k-means clustering

 

🔎비지도학습이란?

  • 입력 데이터에 대한 정답(타깃 값)이 없는 상태에서 데이터의 구조나 패턴을 찾아내는 것이 목표입니다. 비지도 학습은 데이터를 미리 정의된 클래스나 카테고리로 분류하지 않고, 데이터 내의 유사성, 상관관계 또는 특성을 기반으로 그룹화하거나 변환하는 데 초점을 맞춥니다.

🔎k-means clustering란?

  • 비지도 학습에서 가장 널리 사용되는 군집화(clustering) 알고리즘 중 하나입니다. 이 알고리즘은 주어진 데이터를 미리 정의된 수 **K개의 클러스터(cluster)**로 나누는 작업을 수행합니다. 각 클러스터는 비슷한 특성을 가진 데이터 포인트들로 이루어지며, 각 클러스터의 중심(centroid)이 기준이 됩니다.

📚알고리즘 단계

 

1. 초기화

  • k개의 군집 중심을 랜덤하게 설정합니다.
  • 몇개로 데이터를 그룹화할지 결정하는 단계

2. 할당 단계

  •  각 데이터 포인트를 가장 가까운 군집 중심에 할당합니다.

3. 업데이트 단계

  • 각 군집의 중심을 해당 군집에 속한 데이터 포인트들의 평균으로 업데이트합니다.

4. 반복

  • 할당 단계와 업데이트 단계를 군집 중심이 더 이상 변화하지 않을 때까지 반복합니다

📚거리측정 방법

  • k-means 알고리즘은 주로 유클리드 거리(Euclidean Distance)를 사용하여 데이터 포인트와 군집 중심 간의 거리를 계산합니다.

📚엘보우 방법

  • 최적의 k를 선택하는 데 사용됩니다.
  • k를 증가시키면서 각 k에 대한 군집의 응집도(또는 관성, Inertia)를 계산하고, 이를 그래프로 나타내어 그래프에서 응집도가 급격히 감소하는 지점을 찾습니다

📚데이터 로드 및 전처리

 

import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler
#라이브러리로 StandardScaler를 적용하기 위한sklearn의preprocessing 모듈
from sklearn.cluster import KMeans
#sklearn의cluster모듈에서 KMeans알고리즘을 가져올거다.
import matplotlib.pyplot as plt
import seaborn as sns

# 데이터 로드
data = pd.read_csv('Mall_Customers.csv')

# 필요한 열 선택(거리를 구할 수 있는 수치형 데이터) 및 결측값 처리
data = data[['Age', 'Annual Income (k$)', 'Spending Score (1-100)']]

# 데이터 스케일링
scaler = StandardScaler()
data_scaled = scaler.fit_transform(data)

 

📚모델 학습 및 군집화

 

# 최적의 k 찾기 (엘보우 방법)
inertia = [] #엘보우를 저장하기위한 코드
K = range(1, 11) #k개수 지정
for k in K:
    kmeans = KMeans(n_clusters=k, random_state=42) #k를 하나하나 돌아가며 클러스터링 작업
    kmeans.fit(data_scaled)
    inertia.append(kmeans.inertia_)
    #kmeans에는inertia_기본적으로 변수가 저장 되어있어서 값을 쉬게 구할 수 있다.

# 엘보우 그래프 그리기
#최적 엘보우를 보기 위해 그래프 시각화
plt.figure(figsize=(10, 8))
plt.plot(K, inertia, 'bx-')
plt.xlabel('k')
plt.ylabel('Inertia')
plt.title('Elbow Method For Optimal k')
plt.show()

# k=5로 모델 생성 및 학습
kmeans = KMeans(n_clusters=5, random_state=42)
kmeans.fit(data_scaled)

# 군집 결과를 데이터프레임에 할당 해 어떤레이블에 어떤 데이터가 할당 되었구나 확인
data['Cluster'] = kmeans.labels_

 

  • sklearn.cluster.KMeans: k-means 군집화 모델을 생성합니다
    • n\_clusters=k: 군집의 수를 설정합니다.
    • random\_state=42: 랜덤 시드 값으로, 결과의 재현성을 위해 사용됩니다.
    • fit(data\_scaled): 데이터를 학습하여 군집을 형성합니다.
    • labels\_: 각 데이터 포인트가 속한 군집 레이블을 반환합니다.

 

📚군집 시각화

# 2차원으로 군집 시각화 (연령 vs 소득)
plt.figure(figsize=(10, 8))
sns.scatterplot(x=data['Age'], y=data['Annual Income (k$)'], hue=data['Cluster'], palette='viridis')
plt.title('Clusters of customers (Age vs Annual Income)')
plt.show()

# 2차원으로 군집 시각화 (소득 vs 지출 점수)
plt.figure(figsize=(10, 8))
sns.scatterplot(x=data['Annual Income (k$)'], y=data['Spending Score (1-100)'], hue=data['Cluster'], palette='viridis')
plt.title('Clusters of customers (Annual Income vs Spending Score)')
plt.show()

  • matplotlib.pyplot.plot: 그래프를 그립니다.
    • K, inertia, 'bx-': x축, y축 데이터와 그래프 스타일을 설정합니다.}$
  • seaborn.scatterplot: 산점도를 그립니다.
    • x=data['Age']: x축 데이터
    • y=data['Annual Income (k\$)']: y축 데이터
    • hue=data['Cluster']: 색상에 따라 군집을 구분합니다.
    • palette='viridis': 색상 팔레트를 설정합니다.

 


 

☑️ 비지도학습 : 군집화모델 - 계층적 군집화

🔎계층적 군집화란?

  • 계층적 군집화(Hierarchical Clustering)는 데이터포인트를 계층 구조로 그룹화하는 방법입니다.
  • 데이터 포인트를 점진적으로 병합하거나 분할하여 군집을 형성합니다

🔎계층적 군집화의 작동 원리

  • 거리 행렬 계산: 데이터 포인트 간의 거리를 계산하여 거리 행렬을 만듭니다.
  • 군집 병합/분할: 거리 행렬을 기반으로 가장 가까운 군집을 병합하거나, 가장 멀리 떨어진 군집을 분할합니다.
  • 덴드로그램 생성: 군집화 과정을 시각화한 덴드로그램을 생성합니다.

📚데이터 로드 및 전처리

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import AgglomerativeClustering
#AgglomerativeClustering 사용할 병합군집화
import scipy.cluster.hierarchy as sch
#scipy에서 계층적 군집화를 하기 위한 sch클래스 가져오기

# 데이터셋 불러오기
df = pd.read_csv('Mall_Customers.csv')


# 데이터 확인
print(df.head())

# 필요한 열만 선택
X = df[['Age', 'Annual Income (k$)', 'Spending Score (1-100)']]

# 데이터 정규화
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

 

 

📚덴드로그램 생성

plt.figure(figsize=(10, 7))
dendrogram = sch.dendrogram(sch.linkage(X_scaled, method='ward'))
#sch의 dendrogram을 가져와 설정
plt.title('Dendrogram') #타이틀 이름
plt.xlabel('Customers') #xlable 이름
plt.ylabel('Euclidean distances') #ylable 이름
plt.show()

 

📚계층적 군집화 모델 생성

hc = AgglomerativeClustering(n_clusters=5, metric='euclidean', linkage='ward')
#n_clusters를 감으로 적당한 값을 넣고 metric으로 euclidean을 넣었다

#metric은 데이터 포인트 간의 거리 계산  ward는 클러스터 간의 거리를 계산

#ward의 계산은 클러스터를 합쳣을 때 클러스터 내부 데이터가 퍼지는 정도를 보고 최소화하게 병합한다.

# 모델 학습 및 예측
y_hc = hc.fit_predict(X_scaled)

# 결과 시각화
plt.figure(figsize=(10, 7))
plt.scatter(X_scaled[y_hc == 0, 0], X_scaled[y_hc == 0, 1], s=100, c='red', label='Cluster 1')
plt.scatter(X_scaled[y_hc == 1, 0], X_scaled[y_hc == 1, 1], s=100, c='blue', label='Cluster 2')
plt.scatter(X_scaled[y_hc == 2, 0], X_scaled[y_hc == 2, 1], s=100, c='green', label='Cluster 3')
plt.scatter(X_scaled[y_hc == 3, 0], X_scaled[y_hc == 3, 1], s=100, c='cyan', label='Cluster 4')
plt.scatter(X_scaled[y_hc == 4, 0], X_scaled[y_hc == 4, 1], s=100, c='magenta', label='Cluster 5')
plt.title('Clusters of customers')
plt.xlabel('Age')
plt.ylabel('Annual Income (k$)')
plt.legend()
plt.show()

 

 

📚평가 (-1 ~ 1까지 있으며 1에 가까울수록 좋다.)

from sklearn.metrics import silhouette_score

# 실루엣 점수 계산
silhouette_avg = silhouette_score(X_scaled, y_hc)
print(f'Silhouette Score: {silhouette_avg}')

 


 

☑️ 비지도학습 : 군집화모델 - DBSCAN

🔎DBSCAN이란?

  • DBSCAN(Density-Based Spatial Clustering of Applications with Noise)은 밀도 기반 군집화 알고리즘입니다
  • DBSCAN은 데이터 밀도가 높은 영역을 군집으로 간주하고, 밀도가 낮은 영역은 노이즈로 처리합니다
  • 비유: 놀이터에 퍼져서 노는 아이들에게 친구가 되는 기준을 말해준다. 가까운 아이들 3명이 친구다. 한 아이를 선택해서 친구를 찾아본다. (3명 이상이 있다면 코어아이 / 너무 적다면 외톨이) 만약 코어아이라면 아이들이 모여 무리를 만들고 다시한번 찾아보고 밖에있는 아이까지 친구가 되게 만들고 공원에있는 아이들 중 친구를 맺거나 외톨이라고 결론이 날 때까지 반복하는 알고리즘이다.

🔎DBSCAN의 작동원리

  • 임의의 데이터 포인트를 선택합니다.
  • 선택한 데이터 포인트의 eps 반경내에 있는 모든 데이터 포인트를 찾습니다.
  • eps 반경 내의 데이터수 ≥ min_samples : 해당 데이터 포인트를 중심으로 새로운 군집 형성.
  • eps 반경 내의 데이터수 < min_samples : 해당 데이터 포인트를 노이즈로 간주
  • 군집에 속한 데이터 포인트에 대해 2~4 단계를 반복합니다.
  • 모든 데이터 포인트가 처리될 때까지 이 과정을 반복합니다.

eps 반경: 친구가 되기 위한 거리 

min_samples: 한 포인트가 코어포인트로 간주 되기 위한 숫자 

경계 포인트: 자신의 eps 반경 안에 min_samples 보다는 적은 갯수가 있지만 코어 포인트의 eps반경안에있는 친구들 (외톨이도 되지 않는데 코어도 되지 않는 친구)

노이즈포인트: 코어나 경계 포인트가 아닌 친구(외톨이)

 

전문적인 설명

데이터셋의 모든 포인트를 미방문 상태로 둔다. 아직 친구를 찾지않은 상태 => 미방문 상태인 포인트 중 하나를 찾아 탐색을 시작한다.=> 탐색한 포인트 내에서 eps내에 이웃 포인트가 몇개있는지 탐색을 한다. => 코어 포인트인지 구분을 하고 코어포인트가 아니라면 탐색을 중단하고 다른 포인트를 탐색한다.

 

📚 데이터 로드

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler

# 데이터셋 불러오기
df = pd.read_csv('Mall_Customers.csv')


# 데이터 확인
print(df.head())

# 필요한 열만 선택
X = df[['Age', 'Annual Income (k$)', 'Spending Score (1-100)']]

# 데이터 정규화
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

 

📚 DBSACN 수행

from sklearn.cluster import DBSCAN 

#DBSAC은 sklearn의 cluster에 있다
import matplotlib.pyplot as plt
import seaborn as sns
#시각화를 위한 라이브러리를 가져온다.

# DBSCAN 모델 생성
dbscan = DBSCAN(eps=5, min_samples=5)
#DBSCAN(거리, 친구의 숫자)

# 모델 학습 및 예측
df['Cluster'] = dbscan.fit_predict(X)

# 군집화 결과 시각화
plt.figure(figsize=(10, 7))
sns.scatterplot(x='Annual Income (k$)', y='Spending Score (1-100)', hue='Cluster', data=df, palette='viridis')
plt.title('DBSCAN Clustering of Mall Customers')
plt.show()

 

 

📚 파라미터 튜닝

#eps와 min_samples 파라미터를 찾기
# 다양한 조합으로 eps와 min_samples 값 시도
eps_values = [3, 5, 7, 10]
min_samples_values = [3, 5, 7, 10]

for eps in eps_values:
    for min_samples in min_samples_values:
        dbscan = DBSCAN(eps=eps, min_samples=min_samples)
        df['Cluster'] = dbscan.fit_predict(X)
        
        plt.figure(figsize=(10, 7))
        sns.scatterplot(x='Annual Income (k$)', y='Spending Score (1-100)', hue='Cluster', data=df, palette='viridis')
        plt.title(f'DBSCAN Clustering (eps={eps}, min_samples={min_samples})')
        plt.show()

 

 


 

☑️ 비지도학습 : 차원축소 - PCA

🔎PCA이란?

  • PCA(Principal Component Analysis, 주성분 분석)는 고차원 데이터를 저차원으로 변환하는 차원 축소 기법입니다
  • PCA는 데이터의 분산을 최대한 보존하면서, 데이터의 주요 특징을 추출해 저차원 공간으로 변환합니다
  • 데이터의 시각화, 노이즈 제거, 계산 효율성 향상 등의 이점을 얻을 수 있습니다.

📚 비유:

  1. 학생의 성적 데이터가 있다. 국영수 다양한 성적이있다. 10차원으로 고차원 데이터이다.
  2. 첫번째로 데이터 중심화를 한다(국어성적의 평균을 구해 데이터에서 평균 값을 빼준다. 평균을 빼주었기 때문에 평균은 0이 된다.)
  3. 공분산을 계산한다(특징관의 관계를 계산한다/국어점수가 높은 사람은 사회점수도 높더라 등)
  4. 성적변화가 가장 큰 방향을 찾는다.(국어 ->수학 -> 영어 차원으로 보니 성적변화가 가장 컷다)
  5. 변화에 대부분을 차지하는 국영수를 주성분으로 선택한다.(변화가 적은 것들은 무시할 수 있다 가정.)
  6. 학생의 모든 성적을 국영수를 통해 바꿔낸 기준으로 재조정한다. (국영수인 3개의 축으로 데이터를 표현 = 여러가지 과목의 성적 정보를 2개의 과목정보로 요약하게 된다.)

🔎 주요개념

  1. data 중심화: 표준을 빼서 데이터의 평균을 0으로 만들어준다.
  2. 공분산 행렬: 각 특징간에 얼마나 같이 움직이는지 본다.(특징간의 상관관계를 수치적으로 보여준다. 데이터 분포를 보는데 사용)
  3. 고유값/고유백터 계산: 공분산 행렬을 통해 고유값과 고유백터를 계산(데이터가 얼마나 분산 되는지 설명, 고유백터는 방향을 나타낸다. 공분산 행렬을 변환할 때 스케일을 나타내는게 고유값 
  4. 주성분 선택: 고유값이 큰 순서대로 고유백터를 찾고 상위 몇개의 고유백터를 골라 주성분으로 지정(새로운 좌표가 된다 / 일반적으로, 전체 분산의 95% 이상을 설명하는 주성분을 선택합니다. )
  5. 차원축소: 원본데이터를 주성분 축으로 변환해서 차원축소(중요정보 시각화 불필요 정보 제거)

 

📚 데이터 로드

#머신러닝에서 자주 사용 되는 mnist_784를 사용할 것
#mnist_784를 사용하기 위해 sklearn의datasets모듈에서fetch_openml함수를 가져온다
from sklearn.datasets import fetch_openml
import pandas as pd

# MNIST 데이터셋 불러오기
#fetch_openml(이름, 버젼)
mnist = fetch_openml('mnist_784', version=1)

# 데이터와 레이블 분리
X = mnist.data
y = mnist.target

# 데이터 프레임의 첫 5행 출력
print(X.head())
print(y.head())

 

 

📚 표준화 진행

from sklearn.preprocessing import StandardScaler

# 데이터 표준화
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

 

📚 PCA실행

#sklearn의decomposition모듈에서 PCA를 사용
from sklearn.decomposition import PCA

# PCA 모델 생성
pca = PCA(n_components=0.95)  # 전체 분산의 95%를 설명하는 주성분 선택

# PCA 학습 및 변환
X_pca = pca.fit_transform(X_scaled)

# 변환된 데이터의 크기 확인
print(X_pca.shape)

 


📚 주성분 확인

# 선택된 주성분의 수
print(f'선택된 주성분의 수: {pca.n_components_}')

# 각 주성분이 설명하는 분산 비율
print(f'각 주성분이 설명하는 분산 비율: {pca.explained_variance_ratio_}')

# 누적 분산 비율
print(f'누적 분산 비율: {pca.explained_variance_ratio_.cumsum()}')

 

 

📚 PCA 결과 시각화

import matplotlib.pyplot as plt
import seaborn as sns

# 2차원 시각화
plt.figure(figsize=(10, 7))
sns.scatterplot(x=X_pca[:, 0], y=X_pca[:, 1], hue=y, palette='viridis', legend=None)
plt.title('PCA of MNIST Dataset (2D)')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.show()

 


 

☑️ 비지도학습 : 차원축소 - t-SNE

🔎 t-SNE란?

  • t-SNE(t-Distributed Stochastic Neighbor Embedding)는 고차원 데이터를 저차원으로 변환하여 시각화하는 차원 축소 기법입니다.
  • 데이터 포인트 간의 유사성을 보존하면서, 고차원 데이터를 2차원 또는 3차원 공간으로 변환합니다
  • 데이터의 구조와 패턴을 시각적으로 이해할 수 있습니다.

📚 비유

  1. 친구 그룹이있다.
  2. 친구들의 성격과 특성을 나타내는 데이ㅓ가 고차원으로 있다.
  3. 친구간의 유사성 (같이 보내는 시간, 얼마나 친한지 등) 을 고려해 확률로 변환해서 고차원 공간에서의 친구 관계를 나타낸다. => 고차원의 데이터를 보고 각각 데이터간에 관계의 유사성을 본다.
  4. 저차원 데이터 만들기 (친구들을 적은 데이터로 배치한다.) ex) 카페에서 어디 앉는지, 뭘 시키는지
  5. 저차원에서 친구들의 관계를 본다
  6. 이제 고차원과 저차원 데이터 모두 가진 상태다.
  7. 고차원에서 가지는 관계가 최대한 저차원에서도 유사하도록 데이터를 축소하는 방법

고차원 유사성 계산 (가우시안)

저차원 유사성 계산 (T분포)

각각 유사성이 얼마나 유사한지 봐야한다. (Kullback-Leibler divergence: 분산이 얼마나 떨어진지 확인해준다.)

 

🔎 t-SEN작동 원리

  1. 고차원 공간에서의 유사성 계산: 고차원 데이터 포인트 간의 유사성을 확률 분포로 계산합니다.
  2. 저차원 공간에서의 유사성 계산: 저차원 데이터 포인트 간의 유사성을 t-분포를 사용하여 계산합니다.
  3. KL 발산 최소화: 고차원 공간과 저차원 공간 간의 유사성 분포 차이를 KL 발산(Kullback-Leibler divergence)을 통해 최소화합니다.
  4. 반복적 최적화: 저차원 공간에서의 데이터 포인트 위치를 반복적으로 조정하여 최적의 시각화를 얻습니다.

=> 데이터 포인터 간의 유사성을 보존하면서 낮은 차원의 데이터로 바꿀껀데 고차원의 데이터 포인트의 관계는 저차원에서도 보존 되어야한다.

 

다시들어봐야할듯

 


 

☑️ 비지도학습 : 차원축소 - LDA

🔎  LDA란?

  • LDA(Linear Discriminant Analysis, 선형 판별 분석)는 차원 축소와 분류를 동시에 수행합니다.
  • LDA는 데이터의 클래스 간 분산을 최대화하고, 클래스 내 분산을 최소화하는 방향으로 데이터를 변환합니다
  • 데이터의 분류 성능을 향상시키고, 저차원 공간에서 데이터의 구조를 시각화할 수 있습니다.

📚 비유

피크닉을 가기위해 분류를 진행한다.

과일 샌드위치 음료가 있다. => 데이터의 클래스를 정의하는 과정

과일 샌드위치 음료들은 최대한 떨어지게 배치

과일안의 사과나 다른 과일들끼리는 최대한 붙어있게 배치한다.(샌드위치나 음료도 마찬가지)

 

🔎 LDA작동원리

  1. 클래스별 평균 계산: 각 클래스의 평균 벡터를 계산합니다.
  2. 클래스 내 분산 행렬 계산: 각 클래스 내 데이터 포인트의 분산을 계산해 클래스 내 분산 행렬을 만듭니다.
  3. 클래스 간 분산 행렬 계산: 클래스 간 평균 벡터의 분산을 계산하여 클래스 간 분산 행렬을 만듭니다.
  4. 고유값 및 고유벡터 계산: 클래스 내 분산 행렬의 역행렬과 클래스 간 분산 행렬의 곱의 고유값과 고유벡터를 계산합니다.(데이터를 축소하는 기준)
  5. 선형 판별 축 선택: 고유값이 큰 순서대로 고유벡터를 정렬하여 선형 판별 축을 선택합니다.
  6. 데이터 변환: 선택된 선형 판별 축을 사용하여 데이터를 저차원 공간으로 변환합니다.

 

=> 데이터를 축소할 때 클래스를 나누는 동시에 분류를 진행(클래스 내부는 데이터가 뭉치고 클래스 간에는 멀어지게

 

다시 들어봐야할듯

 


 

☑️ 앙상블 학습 - 배깅과 부스팅

🔎 앙상블 학습이란? 

  • 앙상블 학습(Ensemble Learning)은 여러 개의 학습 모델을 결합하여 하나의 강력한 모델을 만드는 기법입니다
  • 앙상블 학습은 개별 모델의 예측을 결합함으로써, 단일 모델보다 더 높은 예측 성능과 일반화 능력을 얻을 수 있습니다.
  • 앙상블 학습의 주요 기법으로는 배깅(Bagging)과 부스팅(Boosting)이 있습니다.

🔎 배깅이란?

  • 배깅(Bootstrap Aggregating)은 여러 개의 학습 모델을 병렬(따로)로 학습시키고, 그 예측 결과를 평균 또는 다수결로 결합하는 앙상블 기법입니다.
  • 배깅은 데이터의 샘플링 과정에서 부트스트래핑(bootstrap) 기법을 사용하여, 원본 데이터셋에서 중복을 허용한 무작위 샘플을 생성합니다.
  • 각 모델은 서로 다른 데이터 샘플을 학습하게 되어, 모델 간의 상관성을 줄이고 예측 성능을 향상시킵니다.

📚배깅모델 구현 및 평가

# 배깅 모델 생성
#estimator 어떤 모델을 복합적으로 만들지 골라준다
#n_estimators 평가개수에 수를 정해준다
bagging_model = BaggingRegressor(estimator=DecisionTreeRegressor(), n_estimators=100, random_state=42)

# 모델 학습
bagging_model.fit(X_train_scaled, y_train)

# 예측
y_pred_bagging = bagging_model.predict(X_test_scaled)

# 평가
mse_bagging = mean_squared_error(y_test, y_pred_bagging)
print(f'배깅 모델의 MSE: {mse_bagging}')

 

🔎  부스팅이란?

  • 부스팅(Boosting)은 여러 개의 약한 학습기(weak learner)를 순차적으로 학습시키고, 그 예측 결과를 결합하여 강한 학습기(strong learner)를 만드는 앙상블 기법입니다
  • 부스팅은 이전 모델이 잘못 예측한 데이터 포인트에 가중치를 부여하여, 다음 모델이 이를 더 잘 학습하도록 합니다.

 

📚 부스팅 모델 구현 및 평가

from sklearn.ensemble import GradientBoostingRegressor

# 부스팅 모델 생성
#estimator모델을 선택하지 않는다. 
#n_estimators 평가개수를 정해준다
boosting_model = GradientBoostingRegressor(n_estimators=100, random_state=42)

# 모델 학습
boosting_model.fit(X_train_scaled, y_train)

# 예측
y_pred_boosting = boosting_model.predict(X_test_scaled)

# 평가
mse_boosting = mean_squared_error(y_test, y_pred_boosting)
print(f'부스팅 모델의 MSE: {mse_boosting}')

 

 


 

☑️ 앙상블 학습 - 랜덤 포레스트

🔎 랜덤 포레스트란?

  • 결정트리를 앙상블 학습으로 개선한 것이 랜덤 포레스트이다.
  • 랜덤 포레스트(Random Forest)는 배깅(Bagging) 기법을 기반으로 한 앙상블 학습 모델입니다.
  • 여러 개의 결정 트리(Decision Tree)를 학습시키고, 그 예측 결과를 결합하여 최종 예측을 수행합니다.
  • 각 트리가 독립적으로 학습되기 때문에, 과적합을 방지하고 예측 성능을 향상시킬 수 있습니다.
  • 여러개의 결정트리로 구성 되고 데이터를 무작위로 샘플링해서 데이터에 대해 학습을해서 결과를 평균, 다수결로 결합해서 최종예측을 한다.

 

📚 랜던 포레스트 구현 및 평가

from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error

# 랜덤 포레스트 모델 생성
rf_model = RandomForestRegressor(n_estimators=100, random_state=42)

# 모델 학습
rf_model.fit(X_train_scaled, y_train)

# 예측
y_pred_rf = rf_model.predict(X_test_scaled)

# 평가
mse_rf = mean_squared_error(y_test, y_pred_rf)
print(f'랜덤 포레스트 모델의 MSE: {mse_rf}')

 

📚 중요 특성 확인

import matplotlib.pyplot as plt
import seaborn as sns

# 특성 중요도 추출
feature_importances = rf_model.feature_importances_

# 특성 중요도를 데이터프레임으로 변환
feature_importances_df = pd.DataFrame({
    'Feature': X.columns,
    'Importance': feature_importances
})

# 중요도 순으로 정렬
feature_importances_df = feature_importances_df.sort_values(by='Importance', ascending=False)

# 특성 중요도 시각화
plt.figure(figsize=(10, 7))
sns.barplot(x='Importance', y='Feature', data=feature_importances_df)
plt.title('Feature Importances in Random Forest')
plt.show()

 

 


 

☑️ 앙상블 학습 - 그래디언트 부스팅 머신 (GBM)

🔎 그래디언트 부스팅 머신 (GBM)란?

  • 그래디언트 부스팅 머신(Gradient Boosting Machine, GBM)은 여러 개의 약한 학습기(weak learner)를 순차적으로 학습시키고, 그 예측 결과를 결합하여 강한 학습기(strong learner)를 만드는 앙상블 기법입니다.
  • GBM은 이전 모델이 잘못 예측한 데이터 포인트에 가중치를 부여하여, 다음 모델이 이를 더 잘 학습하도록 합니다.
  • 각 트리가 독립적으로 학습되기 때문에, 과적합을 방지하고 예측 성능을 향상시킬 수 있습니다.
  • 첫 번째 초안을 만들고 오류가 나면 해석하고 개선한다. 이 과정을 계속 반복한다.
  • 오류 수정을 문법으로 한다.

🔎 그래디언트 부스팅 머신 (GBM)의 원리

  1. 초기 모델 학습: 첫 번째 결정 트리를 학습시켜 초기 모델을 만듭니다.
  2. 잔여 오차 계산: 초기 모델의 예측 결과와 실제 값 간의 잔여 오차를 계산합니다.
  3. 잔여 오차 학습: 잔여 오차를 예측하는 새로운 결정 트리를 학습시킵니다.
  4. 모델 업데이트: 새로운 결정 트리를 기존 모델에 추가하여 모델을 업데이트합니다.
  5. 반복: 잔여 오차가 충분히 작아질 때까지 2~4 단계를 반복합니다.

 

# sklearn의 ensemble 모듈에서 GradientBoostingRegressor가져온다.

from sklearn.ensemble import GradientBoostingRegressor
from sklearn.metrics import mean_squared_error

# GBM 모델 생성
gbm_model = GradientBoostingRegressor(n_estimators=100, learning_rate=0.1, max_depth=3, random_state=42)

# 모델 학습
gbm_model.fit(X_train_scaled, y_train)

# 예측
y_pred_gbm = gbm_model.predict(X_test_scaled)

# 평가
mse_gbm = mean_squared_error(y_test, y_pred_gbm)
print(f'GBM 모델의 MSE: {mse_gbm}')

 

 


 

☑️ 앙상블 학습 - XGBoost

🔎 XGBoost란?

  • XGBoost(eXtreme Gradient Boosting)는 그래디언트 부스팅 알고리즘을 기반으로 한 고성능 앙상블 학습 기법입니다.
  • XGBoost는 효율성, 유연성, 이식성을 목표로 설계되었으며, 다양한 머신러닝 경진대회에서 우수한 성능을 보여주고 있습니다.
  • 병렬 처리, 조기 종료, 정규화 등의 기능을 통해 성능을 극대화합니다.
  • 여러 약한 학습기를 순차적으로 학습시켜서 이전단계의 오류를 부정
  • 학습이 병렬로 할 수 있게 개선
  • 목표함수를 최소화 해 가중치를 업데이트한다.

🔎 XGBoost의 원리

  1. 초기 모델 학습: 첫 번째 결정 트리를 학습시켜 초기 모델을 만듭니다.
  2. 잔여 오차 계산: 초기 모델의 예측 결과와 실제 값 간의 잔여 오차를 계산합니다.
  3. 잔여 오차 학습: 잔여 오차를 예측하는 새로운 결정 트리를 학습시킵니다.
  4. 모델 업데이트: 새로운 결정 트리를 기존 모델에 추가하여 모델을 업데이트합니다.
  5. 반복: 잔여 오차가 충분히 작아질 때까지 2~4 단계를 반복합니다.

🔎 XGBoost의 장점

  • 병렬 처리: 트리의 분할을 병렬로 수행하여 학습 속도를 향상시킵니다.
  • 조기 종료: 검증 데이터셋의 성능이 향상되지 않으면 학습을 조기에 종료하여 과적합을 방지합니다.
  • 정규화: L1 및 L2 정규화를 통해 모델의 복잡도를 조절하고 과적합을 방지합니다.
  • 유연성: 다양한 손실 함수와 평가 지표를 지원하여 다양한 문제에 적용할 수 있습니다.

 


 

☑️ GITHUB 특강

연결하기

1. 파일 연결하기

파일 만들고 commit까지 한 상태

git remote add origin 링크 

git push origin master

 

2. 레포 저장소 폴더 가져오기

레포 저장소 만들고

git clone 레포 주소

git add 파일

commit을 진행

git push

 

TIL작성

홈페이지 만들기

 


☑️ 회고

오늘은 이번주 내에 딥러닝 강의까지 다 듣고 당장 다음주에 팀과제 발제를 받아 진행해야한다는 생각에 무작정 강의를 들었습니다.

 

하지만 너무 많은 내용에 모르는 단어들로 이루어진 문장들이 머리를 어지럽히고 집중력을 떨어뜨렸습니다.

 

강의를 듣는 것은 마치고  슬랙에 올라온 용어 공부를 마지막으로 진행해야겟습니다.

 

용어

  • 리스트 컴프리헨션: 리스트를 간결하게 생성하는 구문으로 반복문과 조건문을 한줄로 표현할 수 있습니다.
  • 이터레이터: 반복 가능한 객체에서 값을 하나씩 꺼내주는 객체. for루프에서 자주 사용
  • 제너레이터: 이터레이터를 쉽게 생성하 수 있는 함수로 yield키워드를 사용하여 값을 하나씩 반환합니다. 메모리 효율성이 뛰어납니다.
  • GIL(Global Interpreter Lock): Python GIL은 여러 스레드가 동시에 실행되는 것을 막고 한 번에 하나의 스레드만 실행되도록하는 잠금 메커니즘입니다.
  • 코루틴: Python 코루틴은 함수 실행을 중단하고 재재할 수 있는 비동기 프로그래밍 방식으로 async와 await키워드를 사용해 동시성을 효율적으로 처리합니다.
  • 람다 표현식: 익명 함수
  • Array: Numpy의 핵심이 되는 데이터 구조로  다차원 배열을 의미 배열연산을 통해 빠르고 효율적인 수학적 계산을 수행
  • ndarray: Numpy에서 사용되는 기본 배열 객체로 n차원의 배열을 나타냄 다차원 데이터를 효울적으로 처리하기 위한 핵김 클래스
  • 형상(Shape): 배열의 각 차원에서 요소의 개수를 나타내는 튜플. 예를들어  2차원배열레서 (행, 열)의 형태로 나타냄 
  • 브로드캐스팅: 크기가 다른 배열 간의 연산을 가능하게 하는 기능. 작은 배열이  큰 배열의 형상에 맞춰 자동으로 확장되어 연산됨
  • 뷰: 배열의 데이터를 복사하지 않고, 같은 데이터를 참조하는 새로운 배열을 의미. 뷰를 변경하면 원래 배열에도 영향을 줌
  • 백터화 연산: 배열 간의 연산을 반복문 없이 한 번에 수행할 수 있는 기능. Numpy의 모든 연산은 벡터화되어있어 빠르고 효율적
  • 집계 함수: 배열의 전체 또는 특정 축에서 값들을 집계하는 함수.  합계,  평균, 최대값, 최소값 등을 구할 수 있음
  • 전치: 다차원 배열의 축을 전환하는 기능. 2차원 배열에서는 행과 열을 바꾸는 작업을 수행
  • 랜덤배열: 데이터 샘플링 및 시뮬레이션 등에 유용 
  • reshape: 배열의 크기를 변경하는 기능. 원소의 개수는 유지하면서 다른 차원의 배열로 변환가능
  • 플랫: 다차원 배열을 1차원 배열로 평평하게 변환하는 작업
  • 마스크 배열: 배열 내에서 특정 조건을 만족하는 값만 선택할 때 사용하는 배열 조건을 부여하여 필터링된 결과를 얻음.
  • NaN(not a number): 숫자가 아닌 값을 나타냄 결측값을 표현하 때 사용되며, np.nan을 통해 NaN을 처리할 수 있음

 

내일부터 공부 패턴을 조금 바꿔 보려고 합니다.

9 ~ 10시 용어 공부

10 ~ 10:10 팀 회의

10:10 ~ 1시 이전에 공부했던 코드들 뜯어 먹기

1 ~ 2시 점심

2 ~6시 강의

6 ~ 7시 저녁

7 ~ 9시 강의 or 유튜브 강의 or 코드 뜯어먹기

+ Recent posts