Scikitlearn

사이킷런 관련 개념과 간단한 예제를 소개하겠습니다.

  • 머신러닝을 위한 다양한 알고리즘,프레임워크,API 등을 제공하는 파이썬기반(Numpy , Scipy)의 라이브러리

  • Scikitlearn 프레임워크는 크게 분류와 회귀로 나뉠 수 있다.

머신러닝 용어정리

피쳐(Feature)

  • 데이터의 일반적인 속성들로 측정이 가능한 특성을 가지고 있다. 통계학에서는 독립변수라고 볼 수 있다.

  • 피쳐들의 집합을 피쳐백터 (Feature Vector)라 한다.

타겟(Target) =결정값(decision Value)

  • 지도학습(Supervised learning)에서 데이터 학습을 위한 정답 데이터로 통계학에서는 종속변수라고 할 수 있다.

레이블(Label) = 클래스(Class)

  • 지도학습(Supervised learning) 중에서도 분류(Classification)에서 쓰이는 결정값을 레이블 혹은 클래스라 한다.

학습세트 (Traning Set)

  • 데이터 세트 (data set)에서 모델학습에 사용되는 부분집합

검증세트(Validation Set)

  • 데이터 세트 (data set)에서 매개변수를 조정하는데 사용하는 부분집합

테스트세트 (Test Set)

  • 데이터 세트 (data set)에서 tranning data를 가지고 학습한 모델을 평가하기 위한 부분집

K-fold 교차 검증 (Cross-Validation)

K-fold 교차검증은 일반화된 성능을 측정하기 위해 데이터를 여러번 반복해서 나누고 모델을 학습하는 방법인다. 일반K-fold와 Stratified K-fold로 나뉘어진다.

일반적인 검증

먼저 , 일반적인 검증은 데이터를 k개의 데이터 폴드로 분할하고, 각 반복수행 시 test set을 다르게 할당한다. 총 k개의 '데이터 폴드 세트(위 그림의 경우 train 4개 + test 1개)'를 구성하여 모델을 학습 및 훈련한 검증 결과들을 평균내어 최종적인 검증 결과를 도출한다.

Stratified k-fold cross validation

불균형한 레이블을 가진 레이블을 가진 데이터 집합을 위해 사용하는 방식으로, 학습데이터와 검증 데이터세트 분포가 유사하도록 맞추는 방법이다.

과적합과 과소적합 (Overfitting and Underfitting)

일반화(generalization)

모델에서 학습에 사용된 데이터가 닌 새로운 데이터에 대해 올바른 예측을 수행하는 능력을 의미한다.[4]

다시말해, 다른 외부 데이터를 입력해도 Tranningdata로 학습한 모델의 결과와 차이가 나지 않은 것을 말한다.

과대적합(Overfitting)

통계에서 과적합은 특정 데이터세트에 가깝도록 정확하고 일치한 분석으로 인해, 추가 데이터에는 적합하지 못하거나 향후 관측이 어려운 현상을 말한다[6]. 즉,많은 정보들을(매개변수) 포함한 복잡한 모델을 만들어, 훈련 데이터세트에만 높은 정확도를 보이고 일반화하기 어려운 현상을 뜻한다. 예를들면 일차원 모델을 N차원 모델을 fitting 시킨 것을 들 수 있다.

과소적합(Underfitting)

너무 간단한 모델이 선택되어 데이터의 특징과 다양성을 잡아내지 못한 현상[5]

예륻들면 선형모델을 비선형 데이터에서 fitting 시켜 좋지 못한 성능 결과를 말할 수 있다.

분류는 지도학습( Supervised learning)의 하나로, 학습 데이터의 category (or Label)관계를 파악하고, 테스 데이터의 category(or Label)을 판별하는 과정이다 . 대표적인 예로 스팸메일 판별이 있다.

분류) 붓꽃(Iris)의 품종 분류

Process

  1. 데이터셋 분리 : 학습데이터(Traning Data)와 테스트데이터(Test Data)로 분리한다.

  2. 모델학습 : 학습데이터로 ML 알고리즘을 이용해 모델학습 (예측결)

  3. 예측 및 평가 :학습된 ML모델로 테스트 데이터 분류를 하고(실제결과), 예측결과와 비교하여 모델성능을 평가

Code Review

필요한 모듈 불러오기

import sklearn

from sklearn.datasets import load_iris #iris 데이터

from sklearn.tree import DecisionTreeClassifier #의사결정나무

from sklearn.model_selection import train_test_split #데이터셋분리

import pandas as pd #판다스

데이터 Frame 변환하기

iris_data = iris.data # feature로만 구성되어있음

iris_df = pd.DataFrame(data=iris_data, columns=iris.feature_names) #Data frame 변

#기존에는 Numpy로만 구성되어 있었지만 columns 옵션에 추가를 하면 column 명들이 추가된다.

iris_df['taget'] = iris.target #타겟 label 추가

iris_df.head(3) #확인

학습과 테스트 셋 분리

X_train, X_test, y_train, y_test = train_test_split(iris_df.iloc[:,:-1], iris_df['label'], test_size=0.3, random_state=11) # 학습: 테스트 = 0.7:0.3 비율로 분

모델학습

dt_clf = DecisionTreeClassifier(random_state=130) #의사결정나무 객체 생성

dt_clf.fit(X_train, y_train) # 학습

예측 및 평가

predict = dt_clf.predict(X_test) #예

predict

from sklearn.metrics import accuracy_score

print('예측 정확도: {0:.4f}'.format(accuracy_score(y_test,pred)))

회귀(Regression)

  • 어떤 자료에 대해서 그 값에 영향을 주는 조건을 고려하여 구한 평균[1].

  • y = h ( x 1 , x 2 , x 3 , . . . , x k ; β 1 , β 2 , β 3 , . . . , β k ) + ϵ 수식에서 h() 가 위에서 말한 조건에 따른 평균을 구하는 함수이며 우리는 이것을 보통 ‘회귀 모델’이라고 부른다.[1]

Kaggle BikeSharing Demand 소개

Bike Sharing Demand 대회는 도시의 키오스크 네트워크로 자동으로 자전거들의 렌탈기록을 기반으로 워싱턴 DC의 Capital Bikeshare 프로그램에서 자전거 렌탈 수요를 예측하는것이 목표입니다. 평가방법은 RMSLE(과소평가된 항목에 패널티를 부여하는 방식으로 0에 가까울수록 정밀도가 높다), 사용하여 score가 낮을수록 더 정확하게 자전거 수요를 예측했다고 생각하시면 됩니다. Data에 대한 설명은 Kaggle Site(Bike Sharing Demand 검)에 방문하여 확인하시길 바라고 이 예제로 회귀분석을 어떻게 하는지 알려드리겠습니다.

Process

  1. 데이터 전처리 : datetime을 년,월,시,분,초, 요일 별로 나누

  2. EDA : train 데이터를 통해 데이터 탐색

  3. 분석 및 예

  • Code는 박조은선생님의 회귀관련 영상을 참고하여 핵심내용만 정리하였습니다.

필요한 모듈 불러오기

import pandas as pd

import numpy as np

import matplotlib as mpl

import matplotlib.pyplot as plt

import matplotlib.font_manager as fm

import seaborn as sns from scipy

import stats

#노트북 안에 그래프를 그리기

%matplotlib inline

데이터 불러오기

train = pd.read_csv("train.csv", parse_dates=["datetime"]) #데이트타임형식으로 데이터를 불러옴

train.shape #(10886, 12)

train.info()# 각 컬럼의 데이터타입 알아보기 , 각 컬럼들의 행갯수가 전체 10886과 동일

train.isnull().sum()

데이터 전처리

#년,월,시,분,초,요 분리작업

train["year"] = train["datetime"].dt.year #년도

train["month"] = train["datetime"].dt.month #월

train["day"] = train["datetime"].dt.day #일

train["hour"] = train["datetime"].dt.hour #시간

train["minute"] = train["datetime"].dt.minute #분

train["second"] = train["datetime"].dt.second #초

train["dayofweek"] = train["datetime"].dt.dayofweek #요일

train.shape #(10886,19)

train.head() # 확인

시각화

#alias를 지정하여 시각화 (2,3)

figure, ((ax1,ax2,ax3), (ax4,ax5,ax6)) = plt.subplots(nrows=2, ncols=3)

figure.set_size_inches(18,8)

sns.barplot(data=train, x="year", y="count", ax=ax1)

sns.barplot(data=train, x="month", y="count", ax=ax2)

sns.barplot(data=train, x="day", y="count", ax=ax3) #일별대여량은 train은 19일까지만 , test는 19일 이후의 기록이 남아 사용하기 어렵다.

sns.barplot(data=train, x="hour", y="count", ax=ax4)

#분초는 모두 0으로 기록되어 사용할 수 없다.

sns.barplot(data=train, x="minute", y="count", ax=ax5)

sns.barplot(data=train, x="second", y="count", ax=ax6)

ax1.set(ylabel='Count',title="연도별 대여량")

ax2.set(xlabel='month',title="월별 대여량")

ax3.set(xlabel='day', title="일별 대여량")

ax4.set(xlabel='hour', title="시간별 대여량")

Reference

  1. Feature: Bishop, Christopher (2006). Pattern recognition and machine learning. Berlin: Springer. ISBN 0-387-31073-8.

  2. Everitt B.S., Skrondal A. (2010), Cambridge Dictionary of Statistics, Cambridge University Press.

Last updated