출처: https://astrocosmos.tistory.com/202 [ASTROCOSMOS:티스토리] '머신러닝' 태그의 글 목록 :: 하나둘셋넷
728x90

내용

  • 먼저 필요 라이브러리들을 불러오자
  • 디렉토리에 학습할 파일이 잘 위치하고 있는지 확인하자
  • 데이터를 필요한 형태로 가공하자
  • 데이터의 정보를 파악하자
  • 타겟 데이터에 대해 파악하자
  • 데이터를 시각화하여 분석하자
  • Random Forest 알고리즘을 사용하여 모델링을 실시하자
  • 먼저, 데이터를 학습용과 평가용으로 나누자
  • 모델을 선언, 학습, 예측을 수행하자
  • 성능을 평가하자

먼저 필요 라이브러리들을 불러오자

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
 
from sklearn.ensemble import RandomForestClassifier # Random Forest 불러오기
from skelarn.model_selection import train_test_split # 데이터를 나누기 위해 불러온다
from sklearn.metrics import * # 모델 성능 평가를 위해 불러온다.

 

디렉토리에 학습할 파일이 잘 위치하고 있는지 확인하자

import os
os.getcwd() # 현재 디렉토리 위치 확인
os.listdir() # 현재 디렉토리의 폴더와 파일 출력
os.listdir('./data') # 특정 폴더 열어보기

 

데이터를 읽고, 필요한 형태로 가공하자

data = pd.read_csv('./data/train_data.csv') # data 변수에 train_data.csv 파일을 불러와서 할당한다.
data.drop('subject', axis =1, inplace = True ) # 불필요한 열을 제거하자

 

데이터의 정보를 파악하자

data.shape() # data 데이터프레임의 행, 열 개수
data.head(5) # 상위 5개 행을 확인
data.tail(3) # 하위 3개 행을 확인
data.columns # 데이터프레임의 컬럼명 확인
data.info() # 데이터프레임의 기초 정보(컬럼명, 데이터 개수, 데이터 타입) 확인
data.info(verbose = True, null_couns = True)
# verbose = True로 하면 모든 열에 대한 정보를 출력, null_counts = True를 하면 각 열에서 null 값의 수를 출력
data.describe() # 데이터프레임의 수치형 데이터 기초통계 정보 확인

 

타겟 데이터에 대해 파악하자

data['Activity].values # 고유값(범주) 확인
data['Activity].value_counts() # 고유값 별 개수 확인
data['Activity'].value_counts() / data['Activity'].value_counts().sum() # 고유값 비율 = 개별 범주의 수 / 전체 범주의 수
 
sns.countplot( data=data, x = 'Activity') # seaborn의 countplot을 통해 타겟 데이터를 시각화하여 분석하자
plt.xticks(rotation=90)
plt.grid()
plt.show()

countplot을 통해 범주별 개수를 시각화하였다.

먼저, 데이터를 학습용과 평가용으로 나누자

y = data['Activity']
x = data.drop('Activity', axis = 1) # target으로 사용할 Activity 컬럼을 제거하자
x_train, x_val, y_train, y_val = train_test_split(x, y, test_size = 0.3, random_state = 2023)


 

모델을 선언, 학습, 예측을 수행하자

rf_model = RandomForestClassifier(random_state=2023) # 모델을 선언한다.
rf_model.fit(x_train, y_train) # 모델을 학습한다.
rf_pred = rf_model.predict(x_val) # 예측을 수행한다.

 

성능을 평가하자

print('accuracy_score', accuracy_score(y_val, rf_pred))
print('\nconfusion_matrix: \n', confusion_matrix(y_val, rf_pred))
print('\nclassification_report: \n', classification_report(y_val, rf_pred))

세 가지 예측을 수행하면 이러한 결과를 확인할 수 있다.

728x90
728x90

XGBClassifier

  • XGBClassifier에 대한 GPT의 답변
  • params 대입 방법

 

XGBClassifier에 대한 GPT의 답변

 

 

params 대입 방법

 

# 라이브러리 불러오기

import numpy as np
import  pandas as pd
import matplotlib.pyplot as plt

from sklearn.model_selection import train_test_split

# 데이터 불러오기

data = pd.read_csv(path)

# target 확인
target = 'ADMIT'

# 데이터 분리
x = data.drop(target, axis=1)
y = data[target]

# 7:3으로 분리
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=1)

# 선언하기
model = XGBClassifier(max_depth=5, random_state=1)

# 학습하기
model.fit(x_train,y_train)



 

학습 결과 출력

 

# 예측하기

y_pred = model.predict(x_test)

 

# 평가하기

print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test,y_pred))

평가물 출력

 

 

728x90
728x90

내용

  • model 저장하기 joblib

728x90
728x90

내용

  • PCA
  • PCA 코드
  • 주성분 누적 분산 그래프 elbow method
PCA 사용하기
* 선언

- 생성할 주성분의 개수 지정
- 원래 feature의 수만큼 지정할 수 있음
( 일반적으로 feature 수 만큼 지정 )
- 생성 후 조정할 수 있음
* 적용
- x_train으로 fit & transform
- 다른 데이터는 적용
- 결과는 numpy array
* 코드
# 라이브러리
from sklearn.decomposition import PCA

# 주성분 분석 선언
pca = PCA(n_components=n)

# 만들고, 적용
x_train_pc = pca.fit_transform(x_train)
x_val_pc = pca.transform(x_val)

 

코드
1. 데이터 준비

(1) 라이브러리 로딩

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

from sklean.model_selection import train_test_split


(2) 스케일링
scaler = MinMaxScaler()
x = scaler.fit_transform(x)

(3) 데이터 분할
x_train, x_val, y_train, y_val = train_test_split(x, y, test_size = .3, random = 20)


2. 차원 축소 : 주성분 PCA

(1) 주성분 만들기
from sklearn.decomposition import PCA

(2) 주성분 분석 수행
# 주성분을 몇 개로 할지 결정( 최대값 : 전체 feature 수)
n = x_train.shape[1]

# 주성분 분석 선언
pca = PCA(n_components = n)

# 만들고 적용
x_train_pc = pca.fit_transform(x_train)
x_val_pc = pca.transform(x_val)

(3) 결과는 numpy array로 주어지므로 데이터 프레임으로 변환

# 컬럼 이름 생성
column_names = ['PC' + str(i+1) for i in range(n) ]

# 데이터프레임으로 변환
x_train_pc = pd.DataFrame(x_train_pc, columns = column_names )
x_val_pc = pd.DataFrame(x_val_pc, columns = column_names
연습

# 주성분 1개짜리
pca1 = PCA(n_components = 1)
x_pc1 = pca1.fit_transform(x_train)

# 주성분 2개짜리
pca2 = PCA(n_components = 2)
x_pc2 = pca2.fit_transform(x_train)

# 주성분 3개짜리
pca3 = PCA(n_components = 3)
x_pc3 = pca3.fit_transform(x_train)
주성분 누적 분산 그래프

- 그래프를 보고 적절한 주성분의 개수를 지정(elbow method)
- x축 : PC 수
- y축 : 전체 분산크기 - 누적분산크기

# 코드
plt.plot( range(1, n+1), pca.explained_variance_ratio_, marker = '.')
plt.xlabel('No. of PC')

728x90
728x90

지도 학습 분류 문제

결정나무 분류

  1. 환경 준비
  2. 데이터 이해
  3. 데이터 준비
  4. 모델링
  5. 기타
  • graphviz
  • 변수 중요도
1. 환경준비
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings

warnings.filterwarnings(action='ignore')
%config InlineBackend.figure_format = 'retina'

# 데이터 읽어오기
data = pd.read_csv(path)
 
2. 데이터 이해
data.head()
data.describe()
data['컬럼명'].value_counts()
data.corr()
 
3. 데이터 준비
1) x, y 분리
target = '타겟 컬럼'

x = data.drop(target, axis = 1)
y = data.loc[:, target]

2) 학습용, 평가용 데이터 분리
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.3, random_state=1)
 
4. 모델링
# 1단계
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import confusion_matrix, classification_report

# 2단계 선언하기
model = DecisionTreeClassifier(max_depth=5, random_state=1

# 3단계 학습하기
model.fit(x_train, y_train)

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

# 5단계 평가하기
print( confusion_matrix(y_test, y_pred) )
print( classification_report(y_test, y_pred) )
 
graphviz
# 시각화 모듈
from sklearn.tree import export_graphviz
from IPython.display import Image

# 이미지 파일
export_graphviz( model,
                            out_file = 'tree.dot',
                            feature_names = x.columns,
                            class_names = ['No', 'Yes'],
                            rounded = True,
                            precision = 2,
                            filled = True)
# 파일 변환
!dot tree.dot -Tpng -otree.png -Gdpi=300

# 이미지 파일 표시
Images(filename = 'tree.png')
 
변수 중요도 시각화
plt.figure(figsize=(5,5))
plt.barh(list(x), model.feature_importances_ )
plt.show()

 

728x90

+ Recent posts