오늘은 강의자료에 있는 문제은행 문제를 풀어보며 복습, 학습을 진행하려고 합니다.

 

우선 머신러닝 1 ~ 5 주차 문제들을 푸는 과정을 보여주고

 

마지막 회고에서 오늘 학습하며 새롭게 알게된 내용, 까먹었던 내용을 설명하겟습니다.

 

순서는

 

1주차 개념 OX 퀴즈!

 

2주차 데이터 클리닝(가상 데이터)

 

3주차 타이타닉 데이터셋과 다양한 분류모겔 비교 실습

 

4주차 비지도 학습 기법을 활용한 최적의 2군집 찾기 모델!

 

5주차 최신 모델을 사용해 캐글 도전하기!(실패! => 주말에 해볼예정!!)

 

회고

 

순서로 진행하겟습니다.

 


☑️ 1주차 개념 OX퀴즈!

  1. 머신러닝은 사람처럼 생각하고 행동하는 기술을 의미한다. (O/X) X
  2. 딥러닝은 머신러닝의 한 분야로, 이미지 인식이나 자연어 처리에 뛰어나다. (O/X) O
  3. 머신러닝에서는 수학 공식에 대한 깊은 이해가 필수적이다. (O/X) X
  4. 머신러닝의 구성요소에는 데이터셋, 특징(Feature), 레이블이 포함된다. (O/X) O
  5. 전통적인 프로그래밍은 데이터를 통해 스스로 학습하고 예측하는 능력을 갖춘다. (O/X) X
  6. 지도 학습은 레이블이 없는 데이터셋을 이용하여 모델을 학습시키는 방법이다. (O/X) X
  7. 배깅(Bagging)은 여러 모델을 독립적으로 학습시키고 예측을 평균내거나 다수결 투표로 최종 예측을 수행한다. (O/X) 
  8. 과적합(Overfitting)은 모델이 훈련 데이터에 지나치게 적응하여 새로운 데이터에 대한 일반화 성능이 떨어지는 현상이다. (O/X) O
  9. 모든 데이터셋에 대해 완벽한 성능을 보이는 모델이 존재한다. (O/X) X

배깅이 기억 나지 않아 답을 기입하지 않았습니다.

배깅이란?

배깅(Bagging)은 여러 모델을 독립적으로 학습시키고 예측을 평균내거나 다수결 투표로 최종 예측을 수행한다.

 


☑️ 2주차 데이터 클리닝(가상 데이터)

import pandas as pd
import numpy as np

# 가상 데이터 생성
data = {
    'TransactionID': range(1, 21),
    'CustomerID': [101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110],
    'PurchaseAmount': [250, -50, 3000000, 450, 0, 300, 200, 150, -10, 800, 50, 75, 400, np.nan, 600, 1000, 20, 5000, 150, 80],
    'PurchaseDate': pd.date_range(start='2024-01-01', periods=20, freq='ME').tolist(),
    'ProductCategory': ['Electronics', 'Clothing', 'Electronics', 'Home', 'Electronics', 'Home', 'Clothing', 'Home', 'Clothing', 'Electronics', 'Electronics', 'Home', 'Clothing', 'Electronics', 'Home', 'Home', 'Clothing', 'Electronics', 'Home', 'Electronics'],
    'CustomerAge': [25, 35, 45, np.nan, 22, 29, 33, 41, 27, 36, 28, 34, 42, 39, 24, 30, 32, 40, 38, 26],
    'CustomerGender': ['Male', 'Female', 'Female', 'Male', 'Female', 'Male', 'Female', np.nan, 'Male', 'Female', 'Male', 'Female', 'Male', 'Female', 'Male', 'Female', 'Male', 'Female', 'Male', 'Female'],
    'ReviewScore': [5, np.nan, 4, 3, 2, 5, 3, 4, 1, 2, np.nan, 4, 5, 3, 4, np.nan, 1, 5, 2, 4]
}

df = pd.DataFrame(data)

 

1. 결측값 처리:

PurchaseAmount, CustomerAge, CustomerGender, ReviewScore 열의 결측값을 적절히 처리하세요.

df['PurchaseAmount'].fillna(df['PurchaseAmount'].mean(), inplace=True)
df['CustomerAge'].fillna(df['CustomerAge'].mean(), inplace=True)
df.dropna(subset=['CustomerGender'], inplace=True)
df['ReviewScore'].fillna(df['ReviewScore'].mean(), inplace=True)

2. 이상치 처리:

PurchaseAmount 열에서 비정상적으로 큰 값과 음수 값을 처리하세요.

1) 이상치 확인 (IQR)

for column in df.columns:
    Q1 = df[column].quantile(0.25)
    Q3 = df[column].quantile(0.75)
    IQR = Q3 - Q1
    
    lower_bound = Q1 - 1.5 * IQR
    upper_bound = Q3 + 1.5 * IQR
    
    outliers = df[(df[column] < lower_bound) | (df[column] > upper_bound)]
    
    if not outliers.empty:
        print(f"Column: {column}")
        print(outliers[[column]])
        print()

 

2) 간단한 이상치 처리

# 음수 값 제거
df = df[df['PurchaseAmount'] >= 0]

# 비정상적인 큰 값 제거
df = df[df['PurchaseAmount'] < 1000000]

 

3) IQR방법사용

# 이상치 처리 

df_no_outliers = df[(df['PurchaseAmount'] >= lower_bound) & (df['PurchaseAmount'] <= upper_bound)]

# 이상치 대체

mean_value = df['PurchaseAmount'].mean()
df['PurchaseAmount']= df['PurchaseAmount'].apply(lambda x: mean_value if x < lower_bound or x > upper_bound else x)

 

3. 중복 데이터 제거:

중복된 TransactionID가 있는 경우 제거하세요.

df = df.drop_duplicates(subset='TransactionID')

 

4. 데이터 타입 변환:

PurchaseDate 열의 데이터 타입을 날짜 형식으로 변환하세요.

df['ProductCategory'] = df['ProductCategory'].astype(str)
df['CustomerGender'] = df['CustomerGender'].astype(str)
df['PurchaseDate'] = pd.to_datetime(df['PurchaseDate'])

 

5. 정규화:

PurchaseAmount 열을 정규화하세요.

# MinMaxScaler

scaler = MinMaxScaler()

df['PurchaseAmount'] = scaler.fit_transform(df[['PurchaseAmount']])

 

# StandardScaler

from sklearn.preprocessing import StandardScaler

numeric_cols = ['TransactionID', 'CustomerID', 'PurchaseAmount', 'CustomerAge', 'ReviewScore', 'CustomerGender', 'ProductCategory']


scaler = StandardScaler()
standard_data = scaler.fit_transform(df_numeric)
print(pd.DataFrame(standard_data, columns=numeric_cols))

 

언제 정규화를 진행할까?

 

  • 스케일이 다른 피처가 있는 경우: 예를 들어, 한 피처는 수백 단위의 값을, 다른 피처는 소수점을 가진 값을 가질 때 정규화가 필요합니다.
  • 거리 기반 알고리즘: k-NN, SVM, 그리고 신경망은 피처들의 상대적인 크기에 매우 민감합니다.
  • 경사 하강법을 사용하는 경우: 피처들의 값이 크게 차이가 나면 학습 과정이 느려질 수 있습니다.

 

6. 범주형 데이터 선별 및 인코딩:

ProductCategory와 CustomerGender 열을 인코딩하세요.

df['ProductCategory'] = df['ProductCategory'].map(lambda x: 0 if x == 'Electronics' else 1 if x == 'Clothing' else 2)
df['CustomerGender'] = df['CustomerGender'].map(lambda x: 0 if x == 'Female' else 1)

 

7. 샘플링:

데이터를 무작위로 5개 샘플링하세요.

# 데이터셋에서 50% 샘플 추출

df_sampled = df.sample(frac=0.5)

# 데이터셋에서 100개의 샘플 추출

df_sampled_n = df.sample(n=100)

 


☑️ 3주차 타이타닉 데이터셋과 다양한 분류모델 비교 실습

 

1. 캐글에서 타이타닉 데이터셋을 다양한 방법으로 다운로드 후 로드해주세요 

# URL 데이터 로드
train_data = pd.read_csv('https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv')

 

2. 이전과제의 코드를 사용해 전처리를 진행하고 타겟 즉 레이블 분리 작업을 해봅시다.

# 필요한 열 선택 및 전처리
df['Age'].fillna(df['Age'].mean(), inplace=True)

df['Sex'] = df['Sex'].apply(lambda x: 0 if x == 'maie' else 1)

 

df = df[['Age', 'Pclass', 'Sex', 'Survived', 'SibSp', 'Parch', 'Fare']]

X = df.drop('Survived', axis=1)
y = df['Survived']


X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

 

3. 3개 이상의 분류모델을 만들어주세요

from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score

# 모델 정의
models = {
    'Logistic Regression': LogisticRegression(max_iter=200),
    'Decision Tree': DecisionTreeClassifier(),
    'Random Forest': RandomForestClassifier(),
    'Support Vector Machine': SVC(),
    'K-Nearest Neighbors': KNeighborsClassifier()
}

# 모델 학습 및 평가
results = {}
for model_name, model in models.items():
    model.fit(X_train, y_train)
    y_pred = model.predict(X_test)
    
    results[model_name] = {
        'Accuracy': accuracy_score(y_test, y_pred),
        'Precision': precision_score(y_test, y_pred),
        'Recall': recall_score(y_test, y_pred),
        'F1 Score': f1_score(y_test, y_pred)
    }

results_df = pd.DataFrame(results).T


results_df

4. 성능을 비교해볼까요?

 

 


☑️4주차 비지도 학습 기법을 활용한 최적의 2군집 찾기 모델!

import pandas as pd
from sklearn.impute import SimpleImputer
from sklearn.cluster import KMeans
from sklearn.metrics import adjusted_rand_score, homogeneity_score, completeness_score


# 데이터 로드
train_data = pd.read_csv('https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv')

data = train_data[['Survived', 'Pclass', 'Age', 'SibSp', 'Parch', 'Fare']]
data = data.dropna()


# 레이블 분리
labels = data['Survived']
data = data.drop('Survived', axis=1)


# KMeans 모델 초기화 (군집 수 2로 설정)
kmeans = KMeans(n_clusters=2, random_state=42)

# 모델 적합
kmeans.fit(data)

# 군집 예측
clusters = kmeans.predict(data)

# 평가 지표 계산
ari = adjusted_rand_score(labels, clusters)
homogeneity = homogeneity_score(labels, clusters)
completeness = completeness_score(labels, clusters)

print(f"Adjusted Rand Index: {ari}")
print(f"Homogeneity: {homogeneity}")
print(f"Completeness: {completeness}")

 


☑️ 기초 수학 특강

기초 통계

1. 질적 데이터와 양적 데이터

 

1)질적: 혈액혈, 시험등급과 같이 종류 구별

 

명목척도: 순서나 크기의 개념없이 단순한 구분만 가능(혈액형, 학생번호, 전화번호 등)

서열 척도: 순서나 대소 관계가 의미가 있지만 비례관계를 나타내지 않음(설문지 만족도 평가, 성적 등급, 순위)

 

2) 양적: 거리, 몸무게등 수치로 표현, 연산가능

 

 구간 척도: 대소 관계와 함께 값들간의 차이에 의미가 있는 데이터, 0의 값은 절대적이지 않고 임의로 정한 기준(온도, IQ, 날짜와 시간)

 비율 척도: 절대적 0을 포함하며 비율 비교가 가능한 데이터(키, 몸무게, 시험 점수, 거리) (절대온도는 0의값이 정해져있어서 비율척도)

2. 데이터의 연속성

1) 이산형 데이터: 연속적인 값이 아닌 정해진 범위 내의 특정 값으로만 표현

값이 하나하나 개별적으로 구분 되는 변수로 주로 정수 값을 가지며 불연속적임(주사위눈, 시험점수, 학생 수)

 

2) 연속형 데이터: 연속적인 값을 가지며, 범위 내에서 무한히 많은 값으로 표현

값이 연속적임, 값 사이에 무한히 많은 세부적인 값이 존재(사람의 키, 온도, 시간)

 

3. 데이터 전처리

1) 질적 데이터(명목척도, 서열척도)는 숫자로 변환하여, 모델에 입력해야함

명목척도: 원 핫 인코딩(숫자에 구분만 짓게하고 숫자 크기 차이에 의미를 두지 않기 위해 한다.)

서열척도: 라벨 인코딩(숫자에 의미를 넣어 대소 관계를 구분 지어야할 때)

 

2) 양적 데이터(등간, 비율 척도)는 숫자 그대로 사용가능

등간 척도 데이터는 비율 척도처럼 절대적 의미가 없기 때문에 주의

-비율연산을 피해야함(값을 두 배로 하거나, 나누기 연산은 의미가 없음 EX. 섭씨 온도20도의 두 배는 40도라고 인식하지 않도록 해야 함)

-정규화: 0~1사이의 정규화보다 표준화(Standard)가 적절

-피처 엔지니어링: 차이를 강조한 특징을 생성하는 것이 좋음(날짜 데이터를 사용할 때 특정 날짜에서 얼마나 시간이 흘렀는지로 표현)

-분류 모델에 클래스로 사용: 순서나 차이만을 반영하도록 데이터 변환(구간별로 범주화 - 온도를 여러 구간(저,중,고온)으로 나눔

 

4. 데이터 시각화(이상치를 처리하는 가능성이 큰 데이터를 보여주기도 한다.)

질적 데이터: 카테고리나 범주의 빈도와 비율 시각화(막대 그래프, 파이 차트, 히트맵)

양적 데이터: 데이터의 분포, 관게, 변화 추이를 시각화(히스토그램, 산점도, 선 그래프, 상자그림)

 

5. 데이터의 중심지표란?

데이터의 중심 경향을 나타내는 값으로 주어진 데이터의 대표적인 값

-평균mean(이상치에 민감)

-중앙값median(이상치에 영향을 덜 받음)

-최빈값mode(이상치에 영향을 덜 받음)

 

-데이터 분포 형태에 따른 중심 지표 비교

대칭: 데이터가 정규 분포처럼 돠우 대칭으로 나타나는 분포(사람의 키, 시험점수, 제품 품질)

왼쪽꼬리: 데이터가 왼쪽으로 치우쳐있을 때 나타나는 분포(기계고장률, 퇴직 연령)

오른쪽 꼬리: 데이터가 오른쪽으로 치우쳐져 있을 때 나타나는 분포(소득 분포, 주택 가격)

 

6. 데이터의 중심 지표의 중요성

데이터의 대표성 활용

1) 결측치, 이상치 대체

2) 데이터 표준화:

-데이터의 분포를 평균이 0, 표준편차가 1(standardscaler)

-표준화된 값은 원래 값이 평균으로부터 얼마나 떨어져있는지 나타내는 상대적인 거리

-표준화의 중요성: 데이터가 서로 다른 단위나 범위를 가질 경우, 학습이 왜곡될 수 있음

3) 모델 선택

-평균 중심의 데이터

데이터가 대칭적: 선형 모델(선형 회귀, SVM)

-중앙값 중심의 데이터

데이터가 치우쳐져 있거나 이상치가 많을 때: 비선형 모델(로버스트 회귀, 랜덤 포레스트)

-최빈값 중심의 데이터:데이터가 명목형(카테고리형)인 경우나 이산형 데이터

주어진 데이터의 주변 이웃 중 가장 많이 나타나는 값 예측(K-이웃)

이산형 결과 예측 시(로지스틱 회귀)

범주형 데이터 기반 분류( 나이브 베이즈)

 

7. 데이터 산포도

데이터가 평균이나 중앙값을 중심으로 얼마나 퍼져 있는지 나타내는 지표

편차variance:각 데이터 값과 데이터의 평균 사이의 차이

분산variance: 편차 제곱의 평균

표준 편차Standard Deviation: 분산의 제곱근으로 단위가 원래 데이터와 같음

사분위수 범위IQR: 중간 50% 데이터의 범위를 나타내는 지표(데이터의 1사분위수(Q1) 3사분위수(Q3)의 차이

 

8. 데이터 상관 관계(수치로 검색해서 보고 선택하는게 좋다)

-양의 상관관계: 한 변수가 증가할 때 다른 변수도 증가하는 관계

-음의 상관 관계: 한 번수가 증가할 때 다른 변수는 감소하는 관계

-무 상관관계:두변수 간에 일정한 관계가 없음(0에 가까울수록 무상관관계다) 

-상관계수: 상관관계의 정도를 수치화한 값이 상관계수(피어슨 상관계수 공식/한계: 주로 선형 관계를 측정하기 때문에 두 변수 간의 관계가 비선형일 경우 이를 제대로 반영하지 못 할 수 있음)

산점도: 상관계수에 따른 데이터 분포 시각화

 

특징(feature)선택

중복정보제거(상관관계가 높은 변수는 유사한 정보를 담고 있을 가능성이 큼,중복되는 변수들 제거하여 모델의 복잡성을 줄이고 성능을 향상 시킬 수 있다.)

중요한 특징 식별: 종속 변수(출력)과 상관관계가 높은 독립변수(입력)을 선택함으로써 모델의 성능을 향상 시킬 수 있음

 

 

9. 확률과 확률 분포

확률: 어떤일이 일어날 가능성을 나타내는 수치

확률 분포: 가능한 경우에 대한 각각의 확률을 나타낸 것

확률의 정의: 특정 사건이 발생하는 경우의 수를 전체 가능 경우의 수로 나눈 값(동전 던지기, 카드 뽑기)

확률의 법칙

어떤 사건 A의 확률은 0에서 1 사이의 값(전체 확률의 합은 1)

확률의 덧셈 법칙: 두 사건 A,B가 있을 때, 둘중 하나가 발생할 확률(두 사건의 확률을 더하고 동시에 일어날 확률을 뺌)

확률의 곱셈 법칙: 두 사건 A,B갈 동시에 일어날 확률(A가 발생활 확률과 A가 발생한 후에 B가 발생할 확률의 곱(서로 독립적일 땐 발생 여부에 영향없음)

여사건 확률: 어떤 사건 A가 일어나지 않을 확률은 1에서 A가 발생할 확률을 뺀 값

조건부 확률: 어떤 사건 a가 발생했을 때, 다른 사건b가 발생할 확률

머신러닝에서의 확률

-다중 클래스 분류:소프트맥스 함수를 통해 각 클래스별 확률을 구함(숫자 이미지 분류)

 

확률분포: 가능한 모든 사건과 각 사건에 대한 확률을 나타낸것

종류

-이산 확률 분포: 이산형 데이터가 가질 수 있는 각각의 값과 그에 대한 확률(주사위 눈금, 로또 번호 추첨, 머신러닝 분류 모델)

-연속 확률 분포:연속형 데이터가 특정 구간에 속할 확률(하루 온도 20~30도일 확률, 금융시장의 주가 확률)

 

 


☑️회고

1주차

배깅이란?

배깅(Bagging)은 여러 모델을 독립적으로 학습시키고 예측을 평균내거나 다수결 투표로 최종 예측을 수행한다.

 

2주차

언제 정규화를 진행할까?

  • 스케일이 다른 피처가 있는 경우: 예를 들어, 한 피처는 수백 단위의 값을, 다른 피처는 소수점을 가진 값을 가질 때 정규화가 필요합니다.
  • 거리 기반 알고리즘: k-NN, SVM, 그리고 신경망은 피처들의 상대적인 크기에 매우 민감합니다.
  • 경사 하강법을 사용하는 경우: 피처들의 값이 크게 차이가 나면 학습 과정이 느려질 수 있습니다.

StandardScaler 사용할 상황은?

데이터의 분포가 정규분포(가우시안 분포)일 때 많이 사용 수치형 데이터에만 사용 가능

 

MinMaxScaler란?

값의 범위를 0과 1사이로 조정하여 정규화를 진행해 모델학습에 도움을 준다.

 

중복값 제거

df = df.drop_duplicates(subset='TransactionID')
TransactionID 열에서 같은 값이 여러 번 나타나는 행 중에서 첫 번째 행을 남기고, 그 외의 중복된 행들을 제거하는 역할

 

IQR을 사용해 제거 및 대체했을 때

제거

df_no_outliers = df[(df['PurchaseAmount'] >= lower_bound) & (df['PurchaseAmount'] <= upper_bound)]
모든 값이 사라짐

 

대체

mean_value = df['PurchaseAmount'].mean()
df['PurchaseAmount'] =df['PurchaseAmount'].apply(lambda x: mean_value if x < lower_bound or x > upper_bound else x)
 PurchaseAmount 모든값이 같은 값으로 바뀜

 

3추차

여러가지 모델 한번에 학습 및 결과 출력 방법

# 모델 정의
models = {
    'Logistic Regression': LogisticRegression(max_iter=200),
    'Decision Tree': DecisionTreeClassifier(),
    'Random Forest': RandomForestClassifier(),
    'Support Vector Machine': SVC(),
    'K-Nearest Neighbors': KNeighborsClassifier()
}

# 모델 학습 및 평가
results = {}
for model_name, model in models.items():
    model.fit(X_train, y_train)
    y_pred = model.predict(X_test)
    
    results[model_name] = {
        'Accuracy': accuracy_score(y_test, y_pred),
        'Precision': precision_score(y_test, y_pred),
        'Recall': recall_score(y_test, y_pred),
        'F1 Score': f1_score(y_test, y_pred)
    }

results_df = pd.DataFrame(results).T


results_df

 

 

results_df = pd.DataFrame(results).T에서 T의 역할은?

데이터프레임의 행을 열로, 열을 행으로 바꿔서 results_df에 저장

 

 

4주차

클러스트링이란?(고객 세분화, 이미지 처리, 문서 군집화 / K-means, Hierarchical Clustering, DBSCAN)

데이터를 비슷한 특성을 가진 그룹(클러스터)으로 나누는 비지도 학습(unsupervised learning) 기법

데이터의 구조를 이해하고, 패턴을 발견하며, 데이터 포인트 간의 유사성을 기반으로 분류하기 위해 사용

목적: 데이터 탐색, 군집화, 분류 전처리, 이상 탐지

 

 

metrics 중

1. adjusted_rand_score

정의: 두 클러스터링 결과 간의 유사성을 측정하는 지표로, 클러스터링의 결과가 얼마나 비슷한지를 평가

범위: -1부터 1까지의 값을 가지며, 1은 완벽하게 일치함, -1은 완전히 불일치함, 0은 임의의 클러스터링을 의미

용도: 클러스터링의 품질을 평가할 때 사용하며, 클러스터링 결과와 실제 레이블 간의 일치를 평가

 

2. homogeneity_score

정의: 클러스터 내의 샘플들이 얼마나 동일한 클래스를 가지는지를 측정( 얼마나 "균일"한지를 평가)

범위: 0에서 1 사이의 값을 가지며, 1은 모든 클러스터가 동일한 클래스를 포함

용도: 클러스터가 얼마나 잘 구성되어 있는지를 평가하며,  ("순수성")

 

3. completeness_score

정의: 실제 레이블의 모든 샘플들이 해당 클러스터에 얼마나 포함되어 있는지를 측정( 샘플들이 얼마나 잘 클러스터링되어 있는지를 평가)

범위: 0에서 1 사이의 값을 가지며, 1은 모든 샘플이 동일한 클러스터에 포함되어 있음을 의미

용도: 얼마나 잘 모든 샘플을 포함하는지를 평가(완전성)

 

train_test_split는 언제 사용?

머신러닝 모델을 훈련하고 평가하기 위해 데이터셋을 훈련 세트와 테스트 세트로 나눌 때 사용

모델을 학습한 후, 테스트 데이터로 학습하지 않은 데이터에서의 성능을 평가

과적합(overfitting)되는 것을 방지하며 일반화 성능을 확인

 

SimpleImputer는 언제 사용?

데이터셋에서 누락된 값을 채우기 위해 사용

누락된 데이터가 있으면 오류가 발생하거나 모델 성능에 영향을 줄 수 있기 때문

 

사용방법

from sklearn.impute import SimpleImputer

imputer = SimpleImputer(strategy='mean')

 

+ Recent posts