Search

Sckikit-learn

대분류
라이브러리
소분류
Python Module
유형
데이터 분석
주요 레퍼런스
https://github.com/good593/course_ai/blob/main/1.%20Machine%20Learning/1.%20Basic%20ML/2.%20Scikit-learn%20Quickstart.ipynb
https://scikit-learn.org/stable/
https://losskatsu.github.io/machine-learning/sklearn/#%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%88%EB%9F%AC%EC%98%A4%EA%B8%B0
https://david-kim2028.tistory.com/entry/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%84%EC%B2%98%EB%A6%AC-fit-fittransform-transform%EC%9D%98-%EA%B0%9C%EB%85%90-%EC%9D%B5%ED%9E%88%EA%B8%B0
https://dacon.io/codeshare/4526
모듈 분류
외장
최종 편집 일시
2024/10/27 15:27
생성 일시
2024/08/20 02:08
13 more properties

설명

머신러닝 분석 모듈
머신러닝을 위한 다양한 알고리즘과 개발을 위한 편리한 프레임워크, API를 제공 주로 Numpy와 Scipy 기반 위에서 구축된 라이브러리

설치

> pip install scikit-learn
Shell
복사

자주 사용하는 사이킷런 모듈

import numpy as np ## 기초 수학 연산 및 행렬계산 import pandas as pd ## 데이터프레임 사용 from sklearn import datasets ## iris와 같은 내장 데이터 사용 from sklearn.datasets import make_classification ## 분류용 가상 데이터 만들기 from sklearn.model_selection import train_test_split ## train, test 데이터 분할 from sklearn.linear_model import LinearRegression ## 선형 회귀분석 from sklearn.linear_model import LogisticRegression ## 로지스틱 회귀분석 from sklearn.naive_bayes import GaussianNB ## 나이브 베이즈 from sklearn import svm ## 서포트 벡터 머신 from sklearn import tree ## 의사결정나무 from sklearn.ensemble import RandomForestClassifier ## 랜덤포레스트 import matplotlib.pyplot as plt ## plot 그릴때 사용
Python
복사
데이터 정제(Data Cleansing) & 속성 공학(Feature Engineering)
sklearn.preprocessing: 데이터 전처리(인코딩, 정규화 등)
sklearn.feature_selection: 특성 선택
sklearn.feature_extraction: 특성 추출(아미지나 텍스트에서 속성 추출)
모델 성능 평가와 개선
sklearn.model_selection: 데이터 분리, 하이퍼 파라미터 튜닝
sklearn.metrics: 성능평가
지도학습(Supervised Learning)
sklearn.ensemble: 앙상블
sklearn.linear_model: 선형모델
sklearn.tree: 의사결정나무
비지도학습(Unsupervised Learning)
sklearn.cluster: 군집분석
sklearn.decomposition: 차원축소
유틸리티와 데이터 세트
sklearn.pipeline: 워크플로우 파이프라인
예제 데이터 세트
사이킷런 알고리즘 명명규칙
분류 알고리즘명: OOClassifier
회귀 알고리즘명: OORegressor
ex) DecisionTreeClassifier
ex) DecisionTreeRegressor

내장된 예제 데이터 셋

datasets. loda_boston() 회귀 용도, 미국 보스턴의 집 피처들과 가격에 대한 데이터 셋
datasets. loda_breast_cancer() 분류 용도, 위스콘신 유방암 피처들과 악성/음성 레이블 데이터 셋
datasets. load_diabetes() 회귀 용도, 당뇨 데이터 셋
datasets. load_digits() 분류 용도, 0 ~ 9 까지의 숫자의 이미지 픽셀 데이터 셋
datasets. load_iris() 분류 용도, 붓꽃에 대한 피처를 가진 데이터 셋

Estimator 클래스

분류 알고리즘 : Classifier
DecisionTreeClassifier
RandomForestClassifier
GradientBoostingClassifier
GaussianNB
SVC
회귀 알고리즘 : Regressor
LinearRegression
Ridge
Lasso
RandomForestRegressor
GradientBoostingRegressor

메서드

make_classfication(): 가상데이터 랜덤 생성

사용법
# 분류용 가상 데이터 만들기 from sklearn.datasets import make_classification X, Y = make_classification(n_samples=1000, n_features=4, n_informative=2, n_redundant=0, random_state=0, suffle=False)
Python
복사
옵션
옵션명
설명
n_sample
표본 수(default=100)
n_features
독립변수 수(default=20)
n_informative
종속변수와 상관관계가 존재하는 독립변수 수(default=2)
n_redundant
독립변수끼리 종속관계에 있는 독립변수 수(default=2)
n_repeated
중복 독립변수 수(default=0)
n_classes
종속변수 클래스(라벨) 수(default=2)
n_clusters_per_class
클래스당 클러스터 수(default=2)
weights
각 클래스에 할당 된 표본 수
random_state
난수 생성 시드(seed) 번호

train, test 데이터 분할하기

오버피팅을 막기위해 데이터를 train, test로 분할
x_train, x_test, y_train, y_test = train_test_split(x,y,test_size=0.25, random_state=0)
Python
복사
옵션
옵션명
설명
test_size
test셋 비율
train_size
train셋 비율(default: 테스트셋의 나머지)
random_state
랜덤시드번호
suffle
데이터섞기(default: true)
statify
라벨 비율 유지

모델 공통 API

fit(x_train, y_train) ## 모수 추정(estimat) get_params() ## 추정된 모수 확인 predict(x_test) ## x_test로부터 라벨 예측 predict_log_proba(x_test) ## 로그 취한 확률 예측 predict_proba(x_test) ## 각 라벨로 예측될 확률 score(x_test, y_test) ## 모델 정확도 평가를 위한 mean accuracy
Python
복사
mean accuracy 각 라벨 종류별로 몇개를 맞췄는지를 표시 ex) 유방암 데이터에서 구분되는 라벨은 2가지 - 병에 걸리지 않았거나(=0) - 걸린 경우(=1)|
mean accuracy=(유방암에 안걸린 사람 맞춘 숫자전체 유방암 안걸린 사람 수+유방암에 걸린 사람 맞춘 숫자전체 유방암 걸린 사람 수)×12\text{mean accuracy} = (\frac{\text{유방암에 안걸린 사람 맞춘 숫자}}{\text{전체 유방암 안걸린 사람 수}} + \frac{\text{유방암에 걸린 사람 맞춘 숫자}}{\text{전체 유방암 걸린 사람 수}} )\times \frac{1}{2}

스케일러

모든 피처들의 데이터 분포나 범위를 동일하게 조정
피처(feature)들마다 데이터값의 범위가 다 제각각이기 때문에 범위 차이가 클 경우 데이터를 갖고 모델을 학습할 때 0으로 수렴하거나 무한으로 발산하기 떄문에 스케일링이 필요

스케일러 방법 종류

~Scaler : 피처(feature)의 통계치를 이용 (열을 대상으로 함)
Normalizer : 행마다 정규화 진행
스케일링 전 정확도 (유방암 데이터셋)
import sklearn import numpy as np import pandas as pd import seaborn as sns import matplotlib.pyplot as plt from sklearn.model_selection import train_test_split from sklearn.tree import DecisionTreeClassifier from sklearn.datasets import load_breast_cancer cancer=load_breast_cancer() cancer_df = pd.DataFrame(data=cancer.data, columns=cancer.feature_names) cancer_df['target'] = cancer.target cancer_df.head() X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, test_size=0.2, random_state=3) dtc = DecisionTreeClassifier() dtc.fit(X_train, y_train) print('모델의 정확도 :', round(dtc.score(X_test, y_test), 4)) # 모델의 정확도 : 0.886
Python
복사

StandardScaler()

모든 피처들을 평균이 0, 분산이 1인 정규분포를 갖도록 만듬
표준화해주는 방법
데이터 내에 이상치가 있다면 데이터의 평균과 분산에 크게 영향을 주기 때문에 스케일링 방법으로 적절하지 않다.
스케일링
from sklearn.preprocessing import StandardScaler std = StandardScaler() std.fit(X_train) X_train_scaled = std.transform(X_train) X_test_scaled = std.transform(X_test) dtc.fit(X_train_scaled, y_train) print('모델의 정확도 :', round(dtc.score(X_test_scaled, y_test), 4)) # 모델의 정확도 : 0.9123
Python
복사
X_train_scaled.shape # (455, 30) # 데이터셋이 numpy array 이기 때문에 shape을 열 1개로 바꾸어서 플로팅 X_train_scaled_ss = X_train_scaled.reshape(13650,1) X_train_data = X_train.reshape(13650,1)
Python
복사
스케일링 전 훈련 데이터 셋 분포
plt.hist(X_train_data, bins=30, color= 'red', alpha = 0.7) plt.title('before data scaling') plt.show()
Python
복사
스케일링 후 훈련 데이터 셋 분포
plt.hist(X_train_scaled_ss, bins=30, alpha = 0.7, density = True) plt.title('StandardScaler') plt.show()
Python
복사

MinMaxScaler()

모든 피처들이 0과 1사이의 데이터값을 갖도록 만듬
피처별로 최솟값은 0이 되고, 최댓값은 1이 되는 것
데이터가 2차원인 겅우, 모든 데이터는 x, y 축의 0과 1 사이에 존재하게 된다.
데이터 내에 이상치가 존재한다면, 이상치가 극값이 되어 데이터가 아주 좁은 범위에 분포하게 되기 때문에 스케일링 방법으로 적절하지 않다.
스케일링
from sklearn.preprocessing import MinMaxScaler mms = MinMaxScaler() mms.fit(X_train) X_train_scaled = mms.transform(X_train) X_test_scaled = mms.transform(X_test) dtc.fit(X_train_scaled, y_train) print('모델의 정확도 :', round(dtc.score(X_test_scaled, y_test), 4)) # 모델의 정확도 : 0.9035
Python
복사
X_train_scaled_mms = X_train_scaled.reshape(13650,1)
Python
복사
스케일링 후 훈련 데이터 셋 분포
plt.hist(X_train_scaled_mms, bins=30, color='green', alpha = 0.7) plt.title('MinMaxScaler') plt.show()
Python
복사

MaxAbsScaler()

모든 피처들의 절댓값이 0과 1 사이에 놓이도록 만듬
0을 기준으로 절댓값이 가장 큰 수가 1또는 -1의 값을 가지게 된다.
이상치의 영향을 크게 받기 때문에 이상치가 존재할 경우 이 방법은 적절하지 않다.
스케일링
from sklearn.preprocessing import MaxAbsScaler mas = MaxAbsScaler() mas.fit(X_train) X_train_scaled = mas.transform(X_train) X_test_scaled = mas.transform(X_test) dtc.fit(X_train_scaled, y_train) print('모델의 정확도 :', round(dtc.score(X_test_scaled, y_test), 4)) # 모델의 정확도 : 0.9123
Python
복사
X_train_scaled_mas = X_train_scaled.reshape(13650,1)
Python
복사
스케일링 후 훈련 데이터 셋 분포
plt.hist(X_train_scaled_mas, bins=30, color='yellow', alpha = 0.7) plt.title('MaxAbsScaler') plt.show()
Python
복사

RobustScaler()

StandardScaler와 비슷
StandardScaler는 평균과 분산을 사용했지만 RobustScaler는 중간값(median)과 사분위값(quartile)을 사용
표준화 후 데이터가 더 넓게 분포해 있음
이상치의 영향을 최소화
스케일링
from sklearn.preprocessing import RobustScaler rbs = RobustScaler() X_train_scaled = rbs.fit_transform(X_train) X_test_scaled = rbs.transform(X_test) dtc.fit(X_train_scaled, y_train) print('모델의 정확도 :', round(dtc.score(X_test_scaled, y_test), 4)) # 모델의 정확도 : 0.9123
Python
복사
X_train_scaled_rbs = X_train_scaled.reshape(13650,1)
Python
복사
스케일링 후 훈련 데이터 셋 분포
plt.hist(X_train_scaled_rbs, bins=30, color='pink', alpha = 0.7) plt.title('RobustScaler') plt.show()
Python
복사

Normalizer()

각 행(row)마다 정규화가 진행
한 행의 모든 피처들 사이의 유클리드 거리가 1이 되도록 데이터값을 만듬
좀 더 빠르게 학습할 수 있고 과대적합 확률을 낮출 수 있음
x축의 범위도 가장 작다.
스케일링
from sklearn.preprocessing import Normalizer norm = Normalizer() X_train_scaled = norm.fit_transform(X_train) X_test_scaled = norm.transform(X_test) dtc.fit(X_train_scaled, y_train) print('모델의 정확도 :', round(dtc.score(X_test_scaled, y_test), 4)) # 모델의 정확도 : 0.9298
Python
복사
X_train_scaled_norm = X_train_scaled.reshape(13650,1)
Python
복사
스케일링 후 훈련 데이터 셋 분포
plt.hist(X_train_scaled_norm, bins=30, color='orange ', alpha = 0.7) plt.title('Normalizer') plt.show()
Python
복사

스케일러 메소드

fit()

머신러닝이 데이터에 머신러닝 모델을 맞추는 것(fit)
1.
학습데이터 세트에서 변환을 위한 기반 설정을 하는 함수
2.
데이터를 학습시키는 메서드

transform()

fit를 기준으로 얻는 mean, variance에 맞춰서 변형하는 것
1.
fit를 통해 세운 기반으로 변형하는 함수
2.
실제로 학습시킨 것을 적용하는 메서드

fit_transform()

상단의 두 기능을 합쳐놓은 것
train dataset에서만 fit_transform 혹은 fit, transform을 사용하는 이유
test set에서도 fit을 해버리면 sclaer가 기존에 학습 데이터에 fit한 기준을 다 무시하고 테스트 데이터에 새로운 mean, variance값을 얻으면서 테스트 데이터까지 학습하기 때문
테스트 데이터는 검증을 위해 남겨둔 셋이기 때문에 반드시 주의

분석 종류

LinearRegression: 선형회귀분석

clf = LinearRegression() clf.fit(x_train,y_train) # 모수 추정 clf.coef_ # 추정 된 모수 확인(상수항 제외) clf.intercept_ # 추정 된 상수항 확인 clf.predic(x_test) # 예측 clf.score(x_test, y_test) # 모형 성능 평가
Python
복사

LogisticRegression: 로지스틱 회귀분석

clf = LogisticRegression(solver='lbfgs').fit(x_train,y_train) clf.predict(x_test) clf.predict_proba(x_test) clf.score(x_test,y_test)
Python
복사

GaussianNB: 나이브 베이즈

gnb = GaussianNB() gnb.fit(x_train, y_train) gnb.predict(x_test) gnb.score(x_test, y_test)
Python
복사

DecisionTree: 의사결정 트리

clf = tree.DecisionTreeClassifier() clf.fit(x_train, y_train) clf.predict(x_test) clf.predict_proba(x_test) clf.score(x_test, y_test)
Python
복사

SVC: 서포트벡터머신

clf = svm.SVC(kernel='linear') clf.fit(x_train, y_train) clf.predict(x_test) clf.score(x_test, y_test)
Python
복사

랜덤포레스트

clf = RandomForestClassifier(max_depth=2, random_state=0) clf.fit(x_train, y_train) clf.feature_importances_ clf.predict(x_test)
Python
복사