머신러닝 Scikit-Learn 사용법 요약
Scikit-learn : 머신러닝에 사용되는 지도/비지도 학습 알고리즘 제공하는 파이썬 라이브러리
내부 구조: Numpy, pandas, Matplotlib 등의 기술을 기반
학습 알고리즘(API) : 라이브러리 import 및 모델 생성 -> 피팅 -> 예측
API 사용방법
1. Scikit-Learn으로부터 적절한 estimator 클래스를 임포트해서 모델의 클래스 선택
2. 클래스를 원하는 값으로 인스턴스화해서 모델의 하이퍼파라미터 선택
3. 데이터를 특징 배열과 대상 벡터로 배치
4. 모델 인스턴스의 fit() 메세드를 호출해 모델을 데이터에 적합
5. 모델을 새 데이터에 대해서 적용
지도 학습: 대체로 predict() 메서드를 사용해 알려지지 않은 데이터에 대한 레이블 예측
비지도 학습: 대체로 transform()이나 predict() 메서드를 사용해 데이터의 속성을 변환하거나 추론
skikit-learn 주요 모듈
- sklearn = s 로 칭하겠음
- s.datasets : 내장된 예제 데이터 세트
- s.model_selection : 교차 검증을 위해 데이터를 학습/테스트용으로 분리, 최적 파라미터를 추출하는 API제공 (GridSearch 등)
- s.metrics : 분류, 회귀, 클러스터링, pairwise에 대한 다양한 성능 측정 방법 제공 (Accuracy, Precision, Recall, ROC=AUC, RMSE 등)
- s.linear_model : 선형 회귀, 릿지(Ridge), 라쏘 (Lasso), 로지스틱 회귀 등 회귀 관련 알고리즘 및 SGD(Stochastic Gradient Descent) 알고리즘 제공
- s.neighbors: 최근접 이웃 알고리즘 제공 (k-NN 등)
- s.tree : 의사 결정 트리 알고리즘 제공
s.preprocessing : 다양한 데이터 전처리 기능 제공
s.feature_selection : 특징(feature)를 선택할 수 있는 기능 제공
s.feature_extraction : 특징(feature) 추출에 사용
s.decomposition : 차원 축소 관련 알고리즘 지원 (PCA, NMF, Truncated SVD)
s.pipeline : 특정 처리 등의 변환과 ML 알고리즘 학습, 예측 등을 '묶어서' 실행할 수 있는 유틸리티 제공
s.svm : 서포트 벡터 메신 알고리즘 제공
s.naive_bayes 나이브 베이즈 알고리즘 제공 (가우시안 NB, 다항 분포 NB 등)
s.ensemble : 앙상블 알고리즘 제공 (Random Forest, AdaBoost, GradientBoost 등)
s.cluster : 비지도 클러스터링 알고리즘 제공 (k-Menas, 계층형 클러스터링, DBSCAN 등)
1-1. 공통적으로 dataset을 준비
#1 numpy로 준비
rs = np.random.RandomState(10)
x = 10* rs.rand(100) #0~10까지 난수 10개
y = 3*x + 2* rs.rand(100)
#2 pandas로 준비
import seaborn as sns
iris = sns.load_dataset("iris")
X = iris.drop("species", axis=1) #특징행렬
y = iris["species"] # 대상행렬
#3. Bunch 객체를 이용
import sklearn.datasets import load_iris
iris = load_iris() # Bunch 객체
X = iris.data #특징행렬
y = iris.target # 대상행렬
1-2. train_test_split으로 데이터를 훈련용 데이터 테스트용 데이터로
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test= train_test_split(iris.data, iris.target, test_size=0.3)
2. 모델클래스 선택 및 인스턴트화 (모델객체생성)
Liner Regression
Import and create the model
from sklearn.linear_model import LinearRegression
model = LinearRegression() #인스턴트화 (모델객체생성)
3. 교차검증을 기반으로 하이퍼파라미터 튜닝
- 1) cross_val_score :교차검증만
- 2) GridSearchCV : 교차검증 + 하이퍼파라미터 튜닝
- 교차검증 폴드수(CV) * 하이퍼파라미터 조합 수 만큼의 학습, 검증 수행
- 하이퍼파라미터 : 머신러닝 알고리즘의 주요 구성 요소/ 값 조정 (사용자입력값)
- 일반적으로 GridSearchCV를 이용해 하이퍼파라미터 수행 -> 테스트 데이터로
최종평가
-[GridSearchCV() 인자] : param_grid:(딕셔너리) 튜닝할 하이퍼파라미터 입력
scoring : 성능평가 지표
cv: 교차검증 폴드 수
refit= True(default) :최적 하이퍼파라미터로 모델 학습
-parameters 조합 - dict 형태로 입력 : { '파라미터_이름' : [ ] }
-각 model별 parameters들에 대한 인자값을 dict 형태로
from sklearn.model_selection import GridSearchCV
# parameters 조합 - dict 형태로 입력 : { '파라미터_이름' : [ ] }
parameters = {'n_jobs':[1, 2, 3], 'normalize':[1.0, 1.2, 1.5]}
# GridSearchCV 설정
grid_model = GridSearchCV(model, param_grid=parameters, cv=3, scoring='accuracy', refit=True)
4. Fit
# fit -> train 시키는것
# train을 X_train, y_train 으로 시키고
# 그 모델을 가지고 predict를 x_test로 진행 : y_pred
# y_pred 와 y_test를 비교
#model.fit(X_train, y_train)
#model.coef_ : contains the coefficients (기울기)
#model.intercept_ : contains the intercept (y절편)
# GridSearchCV를 진행한 model (grid_model)에 fit 진행
grid_model.fit(X_train, y_train)
4-1 GridSearchCV 결과 (딕셔너리)
# GridSearchCV 결과 : .cv_results_(딕셔너리)에 저장 -> dataframe으로
변환후 출력
# GridSearchCV 결과
scores_df = pd.DataFrame(gird_model.cv_results_)
print(scores_df[['params', 'mean_test_score', 'rank_test_score',
'split0_test_score', 'split1_test_score', 'split2_test_score']])
params mean_test_score rank_test_score split0_test_score split1_test_score split2_test_score
0 {'max_depth': 1, 'min_samples_split': 2} 0.700000 5 0.700 0.7 0.70
1 {'max_depth': 1, 'min_samples_split': 3} 0.700000 5 0.700 0.7 0.70
2 {'max_depth': 2, 'min_samples_split': 2} 0.958333 3 0.925 1.0 0.95
3 {'max_depth': 2, 'min_samples_split': 3} 0.958333 3 0.925 1.0 0.95
4 {'max_depth': 3, 'min_samples_split': 2} 0.975000 1 0.975 1.0 0.95
5 {'max_depth': 3, 'min_samples_split': 3} 0.975000 1 0.975 1.0 0.95
4-2 GridSearchCV 결과 중 최적 파라티터, 최고 정확도 결과 조회
# best_params_ :최적 파라미터 조회/ best_score_:최고 성능평가 결과 조회
print('GridSearchCV 최적 파라미터:', grid_model.best_params_)
print('GridSearchCV 최고 정확도:', np.round(grid_model.best_score_, 4))
GridSearchCV 최적 파라미터: {'max_depth': 3, 'min_samples_split': 2}
GridSearchCV 최고 정확도: 0.975
5. Predict 예측수행
# accuracy_score(y_test, y_pred) : 테스트 데이터 세트 정확도
5-1. GridSearchCV 객체로 예측가능 or
y_pred = grid_model.predict(X_test)
print('테스트 데이터 세트 정확도:', np.round(accuracy_score(y_test, y_ pred), 4)
테스트 데이터 세트 정확도: 0.9667
5-2. 학습된 estimator를 반환받아 예측 : best_estimator
#best_estimator : 위에 GridSearchCV를 진행한 파라미터들 중 최적 파라미터와 최고 정
확도를 갖는 파라미터 셋팅을 한 grid_model을 돌려줌
estimator = gird_model.best_estimator_
y_pred = estimator.predict(X_test)
print('테스트 데이터 세트 정확도:', np.round(accuracy_score(y_test, y_pred), 4))
테스트 데이터 세트 정확도: 0.9667
!! test 정확도가 같은 이유
-> refit = True
-[GridSearchCV() 인자] : param_grid:(딕셔너리) 튜닝할 하이퍼파라미터 입력
scoring : 성능평가 지표
cv: 교차검증 폴드 수
refit= True(default) :최적 하이퍼파라미터로 모델 학습
에서 refit=True이면 fit( ) 수행 시 자동으로 최적의 하이퍼파라미터로 estimator가 학습함
5-3 . 그래프로 모델 실효성 확인
plt.scatter(X_train, y_train, s=10)
plt.plot(X_test, y_pred, c='red')
6. 모델평가
from sklearn.metrics import mean_squared_error
rmse = np.sqrt(mean_squared_error(y_test, y_pred))
rmse
7. 모델을 바탕으로 전략실행 (원래 하려던 것)
- 여기 위 까지는 model의 실효성 및 정확성을 검증한 것
-이후 model이 적합하고 정확성이 높다고 판단되면, train과 test set으로 작업하는 것이 아닌, 원래 가지고 놀려고 했던 데이터값인 X와 df로 진행하면 된다
다시 X와 y로 가지고 놀면 된다.
<Native Bayes > : 나이브 베이즈 분류기
1) GaussianNB : 연속적인 어떤 데이터에도 적용
2) BernoulliNB : 이진 데이터에 적용, 각 클래스의 특성 중 0이 아닌 것이 몇개인지
3) MultinomialNB :카운트 데이터(정수)에 적용
2), 3) 은 텍스트 데이터를 분류할 때 사용
1-1. 공통적으로 dataset을 준비
from sklearn.datasets import load_iris
iris=load_iris()
1-2. train_test_split으로 데이터를 훈련용 데이터 테스트용 데이터로
from sklearn.model_selection import train_test_spilt
X_train, X_test, y_train, y_test = train_test_spilt(iris.data, iris.target, test_size=0.3)
2. 모델클래스 선택 및 인스턴트화 (모델객체생성)
from sklearn.native_bayes import MultinomialNB
model = MultinomialNB() # 인스턴스 생성
3. 교차검증을 기반으로 하이퍼파라미터 튜닝
from sklearn.model_selection import GridsearchCV
parameters = {"}