728x90
반응형
##--- Start 'Scikit-learn' ---###
# Features #
Python library with a variety of machine learning algorithms
Simple, consistent API, useful online documentation, plenty of examples
Providing an easy and efficient development library for machine learning
Using number of people and valided various circumstance in library
A library that is used by many user and validated in a variety of environments.
# Main module of the scikit-learn #
sklearn.datasets 내장된 예제 데이터세트
sklearn.preprocessing 다양한 데이터 전처리 기능 제공(변환, 정규화, 스케일링 등)
sklearn.feature_selection 특징(feature)를 선택할 수 있는 기능 제공
sklearn.feature_extraction 특징(feature) 추출에 사용
sklearn.decomposition 차원 축소 관련 알고리즘 지원(PCA, NMF, Truncated SVD 등)
sklearn.modle_selection 교차 검증을 위해 데이터를 학습/테스트용으로 분리,
최적 파라미터를 추출하는 API 제공(Grid Search 등)
sklearn.metrics 분류, 회귀,클러스터링,pairwise에 대한 다양한 성능 측정 방법 제공
(Accuracy, Precision, Recall, ROC-AUC, RMSE 등)
sklearn.pipeline 특징 처리 등의 변환과 ML 알고리즘 학습,
예측 등을 묶어서 실행할 수 있는 유틸리티 제공
sklearn.linear_mode 선형 회귀, 릿지(Ridge), 라쏘(Lasso), 로지스틱회귀 등
관련 알고리즘과 SGD(Stochastic Gradient Descent)알고리즘 제공
sklearn.svm 서포트 벡터 머신 알고리즘 제공
sklearn.neighbors 최근접 이웃 알고리즘 제공(K-NN 등)
sklearn.naive_bayes 나이브 베이즈 알고리즘 제공(가우시안 NB, 다항 분포 NB 등)
sklearn.tree 의사결정 트리 알고리즘 제공
sklearn.ensemble 앙상블 알고리즘 제공(Random Forest, AdaBoost, GradientBoost 등)
sklearn.cluster 비지도 클러스터링 알고리즘 제공(K-Means, 계층형 클러스터링, DBSCAN 등)
# estimator API #
일관성 : 모든 객체는 일관된 문서를 갖춘 제한된 집합에서 비롯된 공통 인터페이스 공유
검사(inspection): 모든 지정된 파라미터 값은 공개 속성으로 노출
제한된 객체 계층 구조:
알고리즘만 파이썬 클래스에 의해 표현
데이터 세트는 표준 포맷(Numpy 배열, Pandas DataFrame, Scipy 희소행렬)으로 표현
매개변수명은 표준 파이썬 문자열 사용
구성: 많은 머신러닝 작업은 기본 알고리즘의 시퀀스로 나타낼 수 있으며,
Scikit-Learn은 가능한 곳이라면 어디서든 이 방식을 사용
합리적은 기본값: 모델이 사용자 지정 파라미터를 필요로 할 때 라이브러리가 적절한 기본값을 정의
# How to use API #
1. Scikit-Learn으로부터 적절한 estimator 클래스를 import해서 모델의 클래스 선택
2. 클래스를 원하는 값으로 인스턴스화해서 모델의 hyper-parameter 선택
3. 데이터를 특징 배열과 대상 벡터로 배치
4. 모델 인스턴스의 fit() 메서드를 호출해 모델을 데이터에 적합
5. 모델을 새 데이터에 대해서 적용
: 지도학습_ 대체로 predict() 메서드를 사용해 알려지지 않은 데이터에 대한 레이블 예측
: 비지도학습_ 대체로 transform() 이나 predict() 메서드를 사용해 데이터의 속성을 변환하거나 추론
### API Usage Examples ###
import numpy as np
import matplotlib.pyplot as plt
plt.style.use(['seaborn-whitegrid'])
x = 10 * np.random.rand(100)
# y = 2 * x + np.random.rand(100) # Case 1.
# y = 2 * x # Case 2.
plt.scatter(x, y)
plt.show()
# 1. 적절한 estimator 클래스를 import해서 모델의 클래스 선택
from sklearn.linear_model import LinearRegression
# 2. 클래스를 원하는 값으로 인스턴스화해서 모델의 Hyper-parameter 선택
model = LinearRegression(fit_intercept=True)
# Class is 'model'
# Want value is 'LinearRegression'
# Hyper-parameter is 'fit_intercept'
# LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None, normalize=False)
# copy_X (입력데이터를 복사를 할것인가 말것인가)
# fit_intercept (상수형태 = True)
# n_jobs (만약 데이터가 클때 cpu를 병렬로 사용)
# normalize (정규화가 되어있는지 확인)
# 3. 데이터를 특징 배열과 대상 벡터로 배치
# 기존의 x 형태 (array)
# [1.64511089 7.6681534 9.28557878 0.13514708 4.05690842 8.96021736
# 7.61678742 6.26860146 6.14106074 3.96377968 3.07894043 9.16108215
# 9.9395881 7.59743569 8.37990978 5.61500835 9.39014297 7.80158773
# ....
# 0.35931633 7.13969353 5.43051811 7.12890307 8.18538054 4.50502205
# 6.39466686 0.16424741 8.58143963 6.97933704 8.00233379 6.82089296
# 4.16572236 0.63316031 5.98846604 2.59918805]
X = x[:, np.newaxis] # Add new axis (transform)
# [[4.09425139]
# [5.47416635]
# [1.50050914]
# ....
# [3.46819546]
# [1.25294203]
# [0.35280061]
# [4.10035939]]
# y 는 그대로 사용
# 4. 모델 인스턴스의 fit() 메서드를 호출해 모델을 데이터에 적합
model.fit(X, y)
# 5. 모델을 새 데이터에 대해서 적용
xfit = np.linspace(-1, 11) # linspace를 통해 새로운 데이터 생성
Xfit = xfit[:, np.newaxis] # 신규 생성된 데이터를 2차원 형태로 만들어 Xfit에 넣어줌
yfit = model.predict(Xfit) # 그것을 predict를 통해 예측 (Xfit)을 넣음 예측결과는 yfit
# 5. 차트 확인
plt.scatter(x, y)
plt.plot(xfit, yfit, '--r') # 예측된 데이터는 red line
plt.show()
## Example DataSet ##
# Classification and Regression Datasets
# Internal DataSets (low size)
# datasets.load_boston() 미국 보스턴의 집에 대한 특징과 가격 데이터(회귀용)
# datasets.load_breast_cancer() 위스콘신 유방암 특징들과 악성/음성 레이블 데이터(분류용)
# datasets.diabetes() 당뇨데이터(회귀용)
# datasets.load_digits() 0에서 9까지 숫자 이미지 픽셀 데이터(분류용)
# datasets.load_iris() 붓꽃에 대한 특징을 가진 데이터(분류용)
# External Datasets (big size)
# fetch_califonia_housing() 캘리포니아 주택 가격 데이터
# fetch_covtype() 회귀 분석용 토지 조사 데이터
# fetch_20newsgroups() 뉴스 그룹 텍스트 데이터
# fetch_olivetti_faces() 얼굴 이미지 데이터
# fetch_lfw_people() 얼굴 이미지 데이터
# fetch_lfw_paris() 얼굴 이미지 데이터
# fetch_rcv1() 로이터 뉴스 말뭉치 데이터
# fetch_mldata() ml 웹사이트에서 다운로드
# 분류와 클러스터링을 위한 표본 데이터 생성 #
# datasets.make_classification()
# 분류를 위한 데이터 세트 생성, 높은 상관도,
# 불필요한 속성 등의 노이즈를 고려한 데이터를 무작위로 생성
# datasets.make_blobs()
# 클리스터링을 위한 데이터 세트 생성.
# 군집 지정 개수에 따라 여러가지 클리스터링을 위한 데이터 세트를 무작위로 생성
# 예제 데이터 세트 구조 #
# 일반적으로 Dictionary 형태로 구성
# data: 특징 데이터 세트
# target: 분류용은 레이블 값, 회귀용은 숫자 결과값 데이터
# target_names: 개별 레이블의 이름(분류용)
# feature_names: 특징 이름
# DESCR: 데이터 세트에 대한 설명과 각 특징 설명
from sklearn.datasets import load_diabetes
diabetes = load_diabetes()
print(diabetes.keys()) # dictionary로 구성
# dict_keys(['data', 'target', 'frame', 'DESCR', 'feature_names',
# 'data_filename', 'target_filename', 'data_module'])
print(diabetes.data) # Feature DataSet
# [[ 0.03807591 0.05068012 0.06169621 ... -0.00259226 0.01990749
# -0.01764613]
# [-0.00188202 -0.04464164 -0.05147406 ... -0.03949338 -0.06833155
# -0.09220405]
# [ 0.08529891 0.05068012 0.04445121 ... -0.00259226 0.00286131
# -0.02593034]
# ...
# [ 0.04170844 0.05068012 -0.01590626 ... -0.01107952 -0.04688253
# 0.01549073]
# [-0.04547248 -0.04464164 0.03906215 ... 0.02655962 0.04452873
# -0.02593034]
# [-0.04547248 -0.04464164 -0.0730303 ... -0.03949338 -0.00422151
# 0.00306441]]
print(diabetes.target) # This data object is Regression(number)
# [151. 75. 141. 206. 135. 97. 138. 63. 110. 310. 101. 69. 179. 185.
# 118. 171. 166. 144. 97. 168. 68. 49. 68. 245. 184. 202. 137. 85.
# 131. 283. 129. 59. 341. 87. 65. 102. 265. 276. 252. 90. 100. 55.
# ...
# 72. 140. 189. 181. 209. 136. 261. 113. 131. 174. 257. 55. 84. 42.
# 146. 212. 233. 91. 111. 152. 120. 67. 310. 94. 183. 66. 173. 72.
# 49. 64. 48. 178. 104. 132. 220. 57.]
print(diabetes.DESCR) # Description
# .. _diabetes_dataset:
# Diabetes dataset
# ----------------
# Ten baseline variables, age, sex, body mass index, average blood
# pressure, and six blood serum measurements were obtained for each of n =
# 442 diabetes patients, as well as the response of interest, a
# quantitative measure of disease progression one year after baseline.
# **Data Set Characteristics:**
# :Number of Instances: 442
# :Number of Attributes: First 10 columns are numeric predictive values
# :Target: Column 11 is a quantitative measure of disease progression one year after baseline
# :Attribute Information:
# - age age in years
# - sex
# - bmi body mass index
# - bp average blood pressure
# - s1 tc, total serum cholesterol
# - s2 ldl, low-density lipoproteins
# - s3 hdl, high-density lipoproteins
# - s4 tch, total cholesterol / HDL
# - s5 ltg, possibly log of serum triglycerides level
# - s6 glu, blood sugar level
# Note: Each of these 10 feature variables have been mean centered and scaled by the standard deviation times the square root of `n_samples` (i.e. the sum of squares of each column totals 1).
# Source URL:
# https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html
# For more information see:
# Bradley Efron, Trevor Hastie, Iain Johnstone and Robert Tibshirani (2004) "Least Angle Regression," Annals of Statistics (with discussion), 407-499.
# (https://web.stanford.edu/~hastie/Papers/LARS/LeastAngle_2002.pdf)
print(diabetes.feature_names)
# ['age', 'sex', 'bmi', 'bp', 's1', 's2', 's3', 's4', 's5', 's6']
print(diabetes.data_filename)
# diabetes_data_raw.csv.gz (압축)
print(diabetes.target_filename)
# diabetes_target.csv.gz (압축)
## model_selection Module ##
# 학습용 데이터와 테스트 데이터로 분리
# 교차 검증 분할 및 평가 (Cross Validation)
# Estimator의 하이퍼 파라미터 튜닝을 위한 다양한 함수와 클래스 제공
# train_test_split(): 학습/테스트 데이터 세트 분리
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_diabetes
diabetes = load_diabetes()
X_train, X_test, y_train, y_test = train_test_split(
diabetes.data, diabetes.target, test_size=0.3)
model = LinearRegression()
model.fit(X_train, y_train)
print("Learned Data Score : {}".format(model.score(X_train, y_train)))
print("Evaluation Data Score: {}".format(model.score(X_test, y_test)))
# Learned Data Score : 0.5574970832528323
# Evaluation Data Score: 0.3465269299469992
# 둘다 1에 가까워야되는데 점수가 좋지 않음
# 점수가 잘나오지 못한 이유에 대해서 시각적으로 확인
import matplotlib.pyplot as plt
predicted = model.predict(X_test)
expected = y_test
plt.figure(figsize=(8, 4))
plt.scatter(expected, predicted)
plt.plot([30, 350], [30, 350], '--r')
plt.tight_layout()
plt.show()
# 당뇨 데이터가 넓게 분포되어 있음
# 빨간선에 가까울 수록 잘 맞춘 것
# 다른 모델을 쓰는 것 또는 데이터 전처리를 통해서 개선시킬 수 있음
### cross_val_score() : 교차검증(Cross Validation)
# 교차검증 위해 두가지
from sklearn.model_selection import cross_val_score, cross_validate
# (model <-LinearRegressionModel, cv = 몇개로 나눌지 k 값 정하기)
scores = cross_val_score(model, diabetes.data, diabetes.target, cv=5)
print("Cross Validation Accuracy : {}".format(scores))
print("Cross Validation Accuracy : {} +/- {}".format(np.mean(scores), np.std(scores)))
# Cross Validation Accuracy : [0.42955615 0.52259939 0.48268054 0.42649776 0.55024834]
# Cross Validation Accuracy : 0.48231643590864215 +/- 0.04926857751190387
# 교차 검증에 불구하고 0.48 밖에 나오지 않음.
### GridSearchCV : 교차 검증과 최적 하이퍼 파라미터 찾기
# 훈련단계에서 학습한 파라미터에 영향을 받아서 최상의 파라미터를 찾는 일은 항상 어려운 문제
# 다양한 모델의 훈련 과정을 자동화하고, 교차 검사를 사용해 최적 값을 제공하는 도구 필요
# 물론 데이터가 적을 때, 많게 되면 시간 다수 소요
from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import Ridge
import pandas as pd
alpha = [0.001, 0.01, 0.1, 1, 10, 100, 1000]
param_grid = dict(alpha=alpha)
gs = GridSearchCV(estimator=Ridge(), param_grid=param_grid, cv=10)
result =gs.fit(diabetes.data, diabetes.target)
print("Optimizer Score: {}".format(result.best_score_))
print("Optimizer Parameter: {}".format(result.best_params_))
print(gs.best_estimator_)
print(pd.DataFrame(result.cv_results_))
# Optimizer Score: 0.46332219117960366
# Optimizer Parameter: {'alpha': 0.1}
# Ridge(alpha=0.1)
# mean_fit_time std_fit_time ... std_test_score rank_test_score
# 0 0.000698 0.000897 ... 0.145852 3
# 1 0.000499 0.000499 ... 0.141449 2
# 2 0.000797 0.000399 ... 0.132683 1
# 3 0.000798 0.000399 ... 0.108386 4
# 4 0.000299 0.000457 ... 0.077298 5
# 5 0.000696 0.000456 ... 0.074561 6
# 6 0.000798 0.000598 ... 0.075191 7
# [7 rows x 19 columns]
### preprocessing 데이터 전처리 모듈 ###
# 데이터의 특징 스케일링(feature scaling)을 위한 방법으로
# 표준화(Standardization)와 정규화(Normalization) 사용
# scikit-learn 에서는 개별 벡터 크기를 맞추는 형태로 정규화
# StandardScaler: 표준화 클래스
# MinMaxScaler: 정규화 클래스
### 성능 평가 지표 ###
# 정확도(Accuracy)
# 정확도는 전체 예측 데이터 건수 중 예측 결과가 동일한 데이터 건수로 계산
# sckit-learn 에서는 accuracy_score 함수를 제공
### 오차 행렬(Confusion Matrix) ###
### 정밀도(Precision)와 재현율(Recall) ###
### F1 Score(F-measure)
# 정밀도와 재현율을 결합한 지표
# 정밀도와 재현율이 어느 한쪽으로 치우치지 않을 때 높은 값을 가짐
### ROC 곡선과 AUC
728x90
반응형
'Deep Learning' 카테고리의 다른 글
Calculating a Function (0) | 2022.09.16 |
---|---|
Linear Models_MLBasic.03 (0) | 2022.09.16 |
Machine Learning_MLBasic.01 (0) | 2022.09.16 |
Auto Encoder (0) | 2022.09.16 |
YOLO (0) | 2022.09.14 |