2024. 1. 12. 09:56ㆍ인공지능/머신러닝 실습(Python)
전체 코드
Iris 품종 분류 경진대회 - DACON
분석시각화 대회 코드 공유 게시물은 내용 확인 후 좋아요(투표) 가능합니다.
dacon.io
이 글에서는 데이콘 연습 대회에 제출한 코드를 바탕으로, 파이썬을 이용한 로지스틱 회귀 모델 이용 방법을 설명한다. 이번에는 데이터 스케일링 작업 없이 실습을 진행하였다(반성).
from sklearn.metrics import accuracy_score
from sklearn.linear_model import LogisticRegression
import pandas as pd
import os
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
# 데이터 세트 로드
dir = os.path.dirname(os.path.realpath(__file__))
train = pd.read_csv(dir + '/train.csv')
test = pd.read_csv(dir + '/test.csv')
submission = pd.read_csv(dir + '/sample_submission.csv')
# train 데이터를 피처와 타겟으로 분리
X = train.drop(['id', 'species'], axis = 1)
y = train['species']
# Label Encoding -> 목표 변수를 숫자로 변환
le = LabelEncoder()
y = le.fit_transform(y)
# train을 훈련 데이터와 검증 데이터로 분리
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=1)
# 훈련 데이터로 로지스틱 회귀 학습
lr_model = LogisticRegression(C=100.0, solver='lbfgs', multi_class='ovr')
lr_model.fit(X_train, y_train)
# 검증 데이터로 예측
predict = lr_model.predict(X_val)
# 검증 데이터로 정확도 평가
accuracy = accuracy_score(y_val, predict)
print('Accuracy:', accuracy)
# 테스트 데이터 예측
X_test = test.drop('id', axis=1)
test_predict = lr_model.predict(X_test)
# csv 파일로 예측한 데이터 출력
submission['species'] = le.inverse_transform(test_predict)
submission.to_csv(dir + '/submission.csv', index=False)
코드별 설명
1. 데이터 불러오기
1.1. 파이썬 파일 경로 읽어오기
import pd
dir = os.path.dirname(os.path.realpath(__file__))
본래 같은 디렉토리내에 있는 파일을 read_csv() 함수로 읽어올 때는 경로를 지정해주지 않아도 되지만, 현재 사용하고 있는 개발 환경인 vs code에서는 경로를 지정해 주어야 제대로 읽어오는 듯하다. 그래서 dir이라는 문자열 변수에 현재 파이썬 파일이 저장되어 있는 경로를 저장하도록 코드를 작성하였다.
위 코드에서 __file__ 은 이 코드를 실행시킨 파일의 위치 및 이름을 출력한다. 그런데 환경에 따라서 위 그림 1과 같이 출력되지 않고 심볼릭 링크나 파일명만으로 나타날 때가 있다. 그래서 os.path.realpath() 함수를 사용해서 실제 경로를 찾아낸다. 마지막으로 os.path.dirname()은 파일의 이름을 제외하고 경로만 반환한다. 이를 실제 코드상에서 수행하면 아래와 같다.
print(__file__)
print(os.path.realpath(__file__))
print(os.path.dirname(os.path.realpath(__file__)))
------------------ 출력 ------------------
C:\Haewon\Python\DACON\iris.py
C:\Haewon\Python\DACON\iris.py
C:\Haewon\Python\DACON
1.2. csv 파일 읽어오기
import pandas as pd
train = pd.read_csv(dir + '/train.csv')
test = pd.read_csv(dir + '/test.csv')
submission = pd.read_csv(dir + '/sample_submission.csv')
csv 파일은 pandas 라이브러리를 사용하여, 간편하게 읽어올 수 있다. 이번 실습에서 읽어와야하는 파일은 'train.csv', 'test.csv', 'sample_submission.csv'의 3개 파일이다. 각각 훈련 데이터, 테스트 데이터, 예시 예측 데이터가 담겨있다.
2. 데이터 셋 나누기
2.1. train 데이터 나누기(입력 데이터와 타겟으로)
X = train.drop(['id', 'species'], axis = 1)
y = train['species']
위 코드는 train 파일에 담겨있던 데이터를 입력 데이터와 타겟으로 분리한다. 여기서 drop() 함수의 axis 매개변수는 어떤 축을 기준으로 삭제 작업이 진행되는지를 결정한다. 위 코드처럼 axis = 1은 열(columns) 방향으로 삭제가 진행되고, axis = 0은 행(index) 방향으로 삭제 작업이 진행된다. 이번 실습에서 구하고자 하는 타겟은 'species'이므로, y 값은 y = train ['species']만 가져온다.
print(train)
print()
print(X)
print()
---------------- 출력 ----------------
id sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) species
0 0 4.6 3.6 1.0 0.2 0
1 1 5.7 4.4 1.5 0.4 0
2 2 6.7 3.1 4.4 1.4 1
3 3 4.8 3.4 1.6 0.2 0
4 4 4.4 3.2 1.3 0.2 0
.. ... ... ... ... ... ...
115 115 6.1 2.8 4.0 1.3 1
116 116 4.9 2.5 4.5 1.7 2
117 117 5.8 4.0 1.2 0.2 0
118 118 5.8 2.6 4.0 1.2 1
119 119 7.1 3.0 5.9 2.1 2
[120 rows x 6 columns]
sepal length (cm) sepal width (cm) petal length (cm) petal width (cm)
0 4.6 3.6 1.0 0.2
1 5.7 4.4 1.5 0.4
2 6.7 3.1 4.4 1.4
3 4.8 3.4 1.6 0.2
4 4.4 3.2 1.3 0.2
.. ... ... ... ...
115 6.1 2.8 4.0 1.3
116 4.9 2.5 4.5 1.7
117 5.8 4.0 1.2 0.2
118 5.8 2.6 4.0 1.2
119 7.1 3.0 5.9 2.1
[120 rows x 4 columns]
train과 X의 출력을 확인해 보면 ID와 species column을 제외한, 나머지 특성이 남아있는 것을 확인할 수 있다.
2.2. 레이블 인코딩
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
y = le.fit_transform(y)
레이블 인코딩은 범형 데이터(Categorical Data)를 수치형 데이터(Numerical Data)로 변환해 주는 작업을 수행한다. 해당 작업은 머신러닝에 있어서 필수적인 작업이다(참고: 티스토리 블로그).
y = train['species']
print('인코딩 전')
print(y)
print()
le = LabelEncoder()
y = le.fit_transform(y)
print('인코딩 후')
print(y)
print()
----------- 출력 -----------
인코딩 전
0 0
1 0
2 1
3 0
4 0
..
115 1
116 2
117 0
118 1
119 2
Name: species, Length: 120, dtype: int64
인코딩 후
[0 0 1 0 0 2 1 0 0 0 2 1 1 0 0 1 2 2 1 2 1 2 1 0 2 1 0 0 0 1 2 0 0 0 1 0 1
2 0 1 2 0 2 2 1 1 2 1 0 1 2 0 0 1 1 0 2 0 0 1 1 2 1 2 2 1 0 0 2 2 0 0 0 1
2 0 2 2 0 1 1 2 1 2 0 2 1 2 1 1 1 0 1 1 0 1 2 2 0 1 2 2 0 2 0 1 2 2 1 2 1
1 2 2 0 1 2 0 1 2]
세부적인 차이는, 직접 코드를 실행함으로써 확인할 수 있다.
2.3. 훈련 데이터와 검증 데이터로 분리
from sklearn.model_selection import train_test_split
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=1)
머신러닝의 모델 학습 과정에서는 샘플들을 훈련, 검증, 테스트 용도로 나눌 필요가 있다. 사이킷 런 패키지에는 이러한 데이터 분할 작업에 이용할 수 있는 train_test_split() 함수가 있고, 위 코드와 같이 작성하면 된다. 여기서 test_size는 검증 데이터의 비율을 말한다. random_state는 데이터 분할에 사용되는 시드값으로, 이 값이 같으면 코드를 돌려도 매번 같은 데이터로 나누어진다.
3. 로지스틱 회귀 모델 생성 및 훈련
from sklearn.linear_model import LogisticRegression
lr_model = LogisticRegression(C=100.0, solver='lbfgs', multi_class='ovr')
lr_model.fit(X_train, y_train)
sklearn 모듈은 LogisticRegression 클래스를 제공한다. 직접 로지스틱 회귀 모델을 만들 필요 없이, 손쉽게 이용 가능하다. 해당 클래스의 상세한 파라미터는 scikit learn 홈페이지에서 확인 가능하다. 여기서는 주요 파라미터에 대해서만 기술한다.
C는 양의 실수를 파라미터로 입력받으며, 규제의 강도를 조절한다. SVM과 유사하게 작은 값일수록 강한 규제를 적용한다. C값이 작을수록 데이터 샘플이 다른 클래스에 놓이는 것을 허용하는 수가 늘어난다. 이는 과대적합을 방지하는 효과가 있다. C값이 높은 경우는 그 반대이다.
solver는 최적화 방법, 다시 말해 비용함수의 최솟값을 어떤 알고리즘을 사용해 찾을 것인지 결정한다. 보통 로지스틱 회귀 모델에 대해 공부할 때, 최적화 방법으로 경사하강법을 공부하나 sklearn에서는 다른 알고리즘들도 이용할 수 있다. 디폴트 값은 lbfgs이다. 이것은 Limited-Memory Broyden-Fletcher-Goldfarb-Shnno의 약자로, 뉴트-랩슨 방법의 변형이다. 2차 도함수를 계산하지만, 근사치를 이용하므로 속도를 개선하였다. l2 규제를 사용할 수 있다.
multi_class 다중 클래스 분류 문제를 해결하는 방법을 정하는 파라미터로써, ovr(One vs Rest)은 이진 분류기를 여러 개 생성하여 각 레이블에 대해 조정하는 방법이다. 이때 각각의 이진 분류기는 한 클래스를 1, 나머지를 0으로 취급하며 학습한다.
4. 검증 데이터를 통한 예측 및 정확도 평가
from sklearn.metrics import accuracy_score
# 검증 데이터로 예측
predict = lr_model.predict(X_val)
# 검증 데이터로 정확도 평가
accuracy = accuracy_score(y_val, predict)
print('Accuracy:', accuracy)
사이킷 런의 accuracy_score 함수는 정답률, 다시 말해 정확도를 계산하는 함수이다.
5. 테스트 데이터로 예측하고 .csv 파일로 출력
# 테스트 데이터 예측
X_test = test.drop('id', axis=1)
test_predict = lr_model.predict(X_test)
# csv 파일로 예측한 데이터 출력
submission['species'] = le.inverse_transform(test_predict)
submission.to_csv(dir + '/submission.csv', index=False)
마지막으로 테스트 데이터를 입력하고 그 예측값을 .csv 파일로 출력하는 것으로 실습은 종료된다. to_csv 함수의 파라미터는 read_csv 함수의 그것과 유사하다. 파라미터 중 index는 행 번호를 적어주는 인덱스 열이 좌측에 추가가 될지 말지를 결정하는데, 원본 데이터를 그대로 저장하고 싶다면 이 값을 False로 입력해야 한다.
'인공지능 > 머신러닝 실습(Python)' 카테고리의 다른 글
머신러닝 실습 - 4. 랜덤 포레스트로 붓꽃 데이터 분류 (0) | 2024.01.17 |
---|---|
머신 러닝 실습 - 3. 결정 트리로 붓꽃 데이터 분류 (0) | 2024.01.16 |
SVM - 붓꽃 데이터 분류 (0) | 2024.01.15 |