본문 바로가기

카테고리 없음

8주차 TIL 머신러닝

728x90

 

출처 : AI SCHOOL 8기 박조은 강사님 강의자료


초반 실습목적

✅ 머신러닝 모델을 실행하는 기본 과정을 이해하기 (학습 => 예측 => 평가)
✅ Scikit-learn API 기본 사용법 익히기
✅ 학습을 하기 위해 학습, 예측 데이터를 나누는 방법
✅ 학습(train, 기출문제, 정답이 있음), 예측(test, 실전 문제, 정답이 없음)
✅ 학습(fit)과 예측(predict)을 하고 평가(evaluate)를 하는 방법
✅ 머신러닝 알고리즘 중에 최근 사용자가 많고 좋은 성능을 내는 DecisionTree 를 사용
✅ DecisionTree 의 기본적인 원리 - 트리계열의 알고리즘은 분류, 회귀에서 모두 사용

 

📌df['TotalCharges'] dtype ( Object => Float )

✅ 공백포함된 숫자로 된 문자열 범주형 변수 => 수치형 변수로 변경해주는 여러가지 방법들

# 1
df["TotalCharges"] = df["TotalCharges"].replace(" ", np.nan)

# 2
df["TotalCharges"] = df["TotalCharges"].replace("", np.nan)

# 3
df["TotalCharges"] = df["TotalCharges"].astype(float)

# 4
df["TotalCharges"] = pd.to_numeric(df["TotalCharges"], errors="coerce")
💡 to_numeric 
errors='coerce'
=> 유효하지 않은 부분을 NaN으로 반환

# 5
df["TotalCharges"] = pd.to_numeric(df["TotalCharges"].str.strip())


📌pd.to_numeric()
✅ 숫자 형식으로 변경시킬 대상으로 스칼라값, list, tuple, Series 등을 지정

pandas.to_numeric(arg, errors='raise', downcast=None)
errors 파라미터​


📝 errors 파라미터 설정  
' ignore ' : 만약 숫자로 변경할 수 없는 데이터라면 숫자로 변경하지 않고 원본 데이터를 그대로 반환
' coerce ' : 만약 숫자로 변경할 수 없는 데이터라면 기존 데이터를 지우고 NaN으로 설정하여 반환
' raise ' : 만약 숫자로 변경할 수 없는 데이터라면 에러 발생 후 코드 중단


결측치(NA)

🤔결측치를 그냥 해당컬럼의 평균값으로 채우면 안되나요 ?

 

✅ TotalCharges(해당컬럼=변수)의 기술 통계나 분포를 먼저 확인
=> 평균값이 적절한 결측치 처리방법으로 판단된다면 해당 방법으로도 적용

✅ 결측치를 채울 때 평균, 중앙값 등으로 채우기도함
=> 결측치가 너무 많은데 해당 변수가 중요한 값일 때는 제거하는 것보다 채우는 것이 더 나을 수도 있음
=>상황에 따라 어떻게 채우느냐에 따라 성능이 나아질 수도 있고 나빠질 수도 있습니다.

 

📊 Chat GPT 답변 ▼

더보기

머신러닝에서 결측치를 채우는 방법은 여러 가지가 있습니다.

1. 평균값, 중앙값, 최빈값 등의 대푯값 사용: 해당 열의 결측치를 해당 열의 평균값, 중앙값, 최빈값 등으로 채움
2. 예측 모델 사용: 해당 열의 값이 결측치인 행을 제외한 나머지 데이터를 이용하여 예측 모델을 만들고, 이를 사용하여 결측치를 채움
3. 대표적으로 회귀 모델(피처 변수를 통해 예측)이나 K-NN 모델(근처에 있는 값으로 채움)을 사용할 수 있음
4. 시계열 데이터에서의 선형보간, 보간법(pandas interplate) 등: 시계열 데이터의 경우, 이전 시점의 데이터를 이용하여 결측치를 보간하는 방법 등을 사용
5. 결측치 제거: 결측치가 너무 많거나 결측치를 채우는 것이 데이터의 품질을 떨어뜨린다고 판단될 경우, 해당 행 또는 열을 제거하는 방법을 사용
6. 이외에도 데이터의 특성에 따라 다양한 방법

=>결측치를 채우는 방법은 데이터의 특성에 따라 선택

 

📊 데이터 분석 결측치 처리 방법론 (링크)
[데이터 분석 최대의 적! 결측치(NA값)처리하기 ]https://m.blog.naver.com/tjdudwo93/220976082118
[[부록]결측치 처리하기(개념잡고가기)] https://blog.naver.com/tjdudwo93/221142961499

 

[부록]결측치 처리하기(개념잡고가기)

이전 포스팅에서 mice를 이용한 결측치 처리 방법에 대해 알아보았다. 이외에도 많은 방법들을 추후 설명할...

blog.naver.com


중반 실습내용


✅데이터셋 : Telco Customer Churn
고객 유지를 위한 행동 예측
인구 통계 정보, 구독 서비스, 고객 계정 정보, 최근 한 달 이내에 탈퇴한 고객(Churn)정보를 담고 있음

✅TotalCharge 컬럼의 타입이 Object => 수치형 변수

# TotalCharge 컬럼의 타입이 Object => 수치형 변수
df["TotalCharges"] = pd.to_numeric(df["TotalCharges"], errors="coerce")

# 결측치를 제거
df = df.dropna()


🤔결측치를 제거해준 이유?
결측치 11개는 그렇게 많은 편이 아니며, 임의의 수로 채워준다면 오히려 예측의 성능이 떨어질 수 있기 때문!

✅결정 트리 모델을 학습위해 => 데이터 학습 데이터/예측 데이터로 분류

feature_names = df.select_dtypes(include="number").columns
 -> 학습 데이터에 들어갈 feature(column)들
label_name = "Churn"
 -> 모델을 통해 예측하고 싶은 컬럼

 

✅지도학습 ( 데이터를 나누고 학습하는 과정 )

 

학습과정(Model 생성)

ScikitLearn의 API=> fit()
X_train
(시험공부 = 학습)
기출문제를 한번 풀어본다  ! 
y_train
(정답을 채점)
풀어본 기출문제의 정답을 보고 채점해보자 !
어떤 API를 가져왔는지, 어떤 머신러닝 기법이 사용되는지, 딥러닝을 사용했는지에 따라 성능이 달라진다 ! 

 

예측과정 (Model 성능 시험)

ScikitLearn의 API=> predict()
X_test
(실제 시험 = 모델 성능 점검)
실제 모의고사에서 시험을 쳐본다! 
y_test
(실제 시험 정답 확인 = 모델의 성적)
실제 모의고사의 정답을 확인한다!
(모델의 학습 목표)
 여러 가지 평가 기준에 따라 점수를 출력해볼 수 있습니다 ! 


학습과정(X_train, y_train) & 예측과정(X_teset, y_test)

 

X = df[feature_names]
y = df[label_name]

split_count = int(df.shape[0] * 0.8) # 행의 수 * 0.8 해주고 int()로 감싸 정수로 만들어줌

X_train = X[:split_count], X_test = X[split_count:]
y_train = y[:split_count], y_test = y[split_count:]

 

+
https://www.youtube.com/watch?v=DFUqMbWs5d8&list=PLkDaE6sCZn6E7jZ9sN_xHwSHOdjUxUW_b&index=7
요즘 트렌드는 학습에 최대한 많은 데이터를 사용하는 방법론
앤드류 응 교수님 강의

 


분류와 회귀

  분류 회귀
독립변수 시험 공부 시간 시험 공부 시간
종속변수 시험 합격 여부(범주) 시험점수(연속)

출처 : AI SCHOOL 8기 박조은 강사님 강의자료
출처 : AI SCHOOL 8기 박조은 강사님 강의자료

 


Graph_Viz

 

✅ graphviz는 시각화 도구로서, 의사결정트리, 그래프, 네트워크 등의 다양한 그래프를 그리는데 사용

✅ 파이썬에서 사용하기 위해서는 pip의 graphviz 패키지, 일반적인 graphviz 프로그램 둘 다 설치

📝pip의 graphviz 패키지는 파이썬에서 graphviz를 사용하기 위한 라이브러리

    파이썬 스크립트에서 graphviz를 사용할 수 있게 해줍니다

    => 이 패키지만으로는 그래프 시각화를 위한 실제 그래프 파일 생성이 불가능

📝일반적인 graphviz 프로그램을 설치

   그래프를 생성하고 시각화하는데 필요한 도구들을 제공

    파이썬에서 그래프 파일을 생성할 수 있게 되며, 이를 이용하여 그래프 시각화

📌pip의 graphviz 패키지 일반적인 graphviz 프로그램 둘 다 설치=> 파이썬에서 그래프 시각화를 위한 필수 도구들 세팅

 


Plot_Tree

출처 : How to Visualize a Decision Tree in 3 Steps with Python - Just into Data

 

✅ 의사결정트리(decision tree)의 시각화를 위한 함수

✅ 의사결정트리는 분류(classification)나 회귀(regression) 문제를 해결하기 위해 사용되는 모델 중 하나

✅ 트리 구조를 사용하여 데이터를 분류하거나 예측합니다.

✅ 의사결정트리의 노드(node)와 엣지(edge)를 쉽게 파악

✅ 트리의 깊이(depth), 노드의 분할 기준(split criteria), 클래스(class) 분류 등을 확인

# plot_tree 를 통해 tree 를 시각화 합니다.
from sklearn.tree import plot_tree

plt.figure(figsize=(20, 20))
plot_tree(model, filled=True, max_depth=5, fontsize=12, 
          feature_names=feature_names);

💡 max_depth 지정 기준 ❓

더보기

📝No Free Lunch 논문의 내용
    데이터의 크기, 변수의 개수, 데이터의 특징에 따라 max_depth 값이 달라짐
    max_depth 가 너무 ▼ 언더피팅(과소적합)
                           너무 ▲ 오버피팅(과대적합)
    여러 값을 사용해 보고 좋은 성능을 내는 값을 선택해서 사용 => 하이퍼파라미터튜닝

 


지니 불순도

출처 : 지니불순도- 위키백과, 우리 모두의 백과사전

✅ 집합에 이질적인 것이 얼마나 섞였는지를 측정하는 지표
✅ 트리는 불순도가 낮아지게끔( 최솟값 0 ) 분할 기준 선택
✅ 지니계수가 0이 되면 그리는 것을 멈춤
✅ 집합에 있는 항목이 모두 동일 => 이 집합 완전히 순수(=분리)

 

💡49%,51%로 분류한 A
    95% 5%로 분류한 B
  =>B가 순수도가 더 ▲ (A가 불순도가 더▲)

더보기
# 아무것도 섞여있지 않은 상태
1 - (1/1) ** 2

# 두가지 클래스를 분류할 때 반반이라면 y 축 값이 가장 높은 값이 0.5가 됩니다.
1 - (5/10) ** 2 - (5/10) ** 2

# 예시
1 - (4137/5625) ** 2 - (1488/5625) ** 2

 

+불순도(Impurity)

- 해당 범주 안에 서로 다른 데이터 값이 섞여있는지 ❓

- 다양한 개체들이 섞여 있을수록 불순도 ▲

 

엔트로피 

출처 : 정보 엔트로피 - 위키백과, 우리 모두의 백과사전

✅ 값이 작을수록 (0에 가까울수록)  순수도가 높으며 같은 특성을 가진 객체들로만 잘 분류
✅ 엔트로피는 지니불순도에 비해 트리 분할 품질을 좀 더 엄격하게 평가

 

+ 섀넌의 엔트로피

더보기

2 개의 공정한 동전을 던질 때 정보 엔트로피는 발생 가능한 모든 결과의 개수에 밑이 2 인 로그를 취한 것과 같다.

2 개의 동전을 던지면 4 가지 결과가 발생할 수 있고, 엔트로피는 2 비트가 된다.

일반적으로 정보 엔트로피는 모든 발생가능한 결과의 평균적인 정보가 된다.

클래스 개수 최소엔트로피 최대엔트로피
2 == 2 ** 1 0 1
8 == 2 ** 3 0 3
16 == 2 ** 4 0 4

 

📌지니불순도, 엔트로피 -> 트리의 품질을 수치화

     데이터가 많이 섞이면 우리가 얻을 수 있는 정보▼ = 결정을 내릴만한 충분한 정보▼


후반 실습내용

 

✅ 머신러닝 알고리즘(DecisionTreeClassifier) 가져와서 fit, predict

model  = DecisionTreeClassifier(random_state=42)

model.fit(X_train, y_train)
  # 결정트리 알고리즘에 X_train, y_train 데이터를 넣어 학습시킴
y_predict = model.predict(X_test)  # 학습된 모델에 X_test 데이터를 넣어주어 값을 예측(여기서는 고객 이탈 여부 예측)

 

✅ 우리가 학습시킨 결정트리 모델의 정확도 ( Accuracy 구하는 코드 )

# 모델의 정확도(Accuracy) 측정 방법1
(y_test == y_predict).mean()
# 모델의 정확도(Accuracy) 측정 방법2
from sklearn.metrics import accuracy_score
accuracy_score(y_test, y_predict)
# 모델의 정확도(Accuracy) 측정 방법3
model.score(X_test, y_test)

Fast AI

✅ 다른 라이브러리는 텐서에 대한 개념 기본 계산 등으로 시작하는 반면 fast.ai 는 CNN 모델 구현부터 시작

✅ 데이터 윤리를 중요하게 다룹니다.

https://docs.fast.ai/

 

fastai - Welcome to fastai

fastai simplifies training fast and accurate neural nets using modern best practices

docs.fast.ai


결정트리

✅ 사이킷런의 의사결정 트리 분류 모델 (DecisionTreeClassifier)

 

 주요 파라미터
criterion 가지의 분할의 품질을 측정하는 기능
max_depth 트리의 최대 깊이
min_samples_split 내부 노드를 분할하는 데 필요한 최소 샘플 수
min_samples_leaf 리프 노드에 있어야 하는 최소 샘플 수
max_leaf_nodes 리프 노드 숫자의 제한치
random_state 추정기의 무작위성을 제어
실행했을 때 같은 결과가 나오도록 함

💡 결정트리의 export_text나 feature_importance를 보면서 마케팅 전략을 세울 수 있다!

 

✅ 머신러닝의 모델 개선 방법

📝 데이터 분할
📝 데이터 전처리, 결측치 처리
📝 피처 선택, 피처 엔지니어링(스케일링, 변환, 인코딩 등)
📝 모델의 파라미터 값을 변경하는 방법

 


🤔 사이킷런으로 전처리를 할 때 fit은 train 에만  transform 은 train, test ❓

📝 test 데이터에 scale하면 train데이터에서 fit 했던 기준 모두 무시!

테스트 데이터에 scaled_X_test = scaler.fit_transform(X_test)를 적용 X!

=> scaler 객체가 기존에 학습 데이터에 fit 했던 기준을 모두 무시, 다시 테스트 데이터를 기반으로 기준을 적용

=> 학습과 테스트 데이터로 나누기 전에 먼저 Scaling등의 데이터 전처리

 

 

+ Decision Tree 관련 링크들 ▼

더보기

ttps://www.inflearn.com/questions/19038/fit-amp-transform-%EA%B3%BC-fit-transform%EC%9D%98-%EC%B0%A8%EC%9D%B4%EA%B0%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80%EC%9A%94

 

fit & transform 과 fit_transform의 차이가 무엇인가요? - 인프런 | 질문 & 답변

안녕하세요, 정말 좋은 강의 잘 듣고 있습니다!! sklearn 의 클래스를 사용하다보면 fit, transform이 많이 언급되는데요. 어쩔때는 fit 하고나서 transform을 수행하거나 fit_transform으로 한번에 수행하는

www.inflearn.com

 

📝의사결정나무 관련 강의내용 (동국대)

http://bigdata.dongguk.ac.kr/lectures/datascience/_book/%EC%9D%98%EC%82%AC%EA%B2%B0%EC%A0%95%EB%82%98%EB%AC%B4tree-model.html

 

10 장 의사결정나무(tree model) | 데이터과학

훈련자료: \(({x}_i,y_i)\), \(i=1,\ldots,n\), \({x}_i=(x_{i1},\ldots,x_{ip})^T\)

bigdata.dongguk.ac.kr

 

📝파이썬 라이브러리를 활용한 머신러닝“의 1장과 2장 내용

https://tensorflow.blog/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D/2-3-5-%EA%B2%B0%EC%A0%95-%ED%8A%B8%EB%A6%AC/

 

2.3.5 결정 트리

2.3.4 나이브 베이즈 분류기 | 목차 | 2.3.6 결정 트리의 앙상블 – 결정 트리decision tree는 분류와 회귀 문제에 널리 사용하는 모델입니다. 기본적으로 결정 트리는 결정에 다다르기 위해 예/아니오

tensorflow.blog

 

📝결정트리 사용법(공식 문서)

https://scikit-learn.org/stable/modules/tree.html

 

1.10. Decision Trees

Decision Trees (DTs) are a non-parametric supervised learning method used for classification and regression. The goal is to create a model that predicts the value of a target variable by learning s...

scikit-learn.org

 

728x90