[회고] 신입 iOS 개발자가 되기까지 feat. 카카오 자세히보기

사이킷런 12

[scikit-learn 라이브러리] 교차 검증

교차 검증 (Cross Validation) 일반화 성능 향상을 위해 훈련 세트와 테스트 세트를 한 번만 나누는 것보다 더 안정적이고 뛰어난 평가 방법이다. 여러개의 세트로 구성된 학습 데이터와 테스트 데이터로 학습과 평가를 수행한다. k-겹 교차검증 : 데이터를 폴드(fold)라는 거의 비슷한 크기의 부분집합 k개로 분리하고 각 부분집합의 정확도를 측정한다. 교차 검증의 점수가 높을수록 데이터셋에 있는 모든 샘플에 대해 모델이 잘 일반화되게 된다. 하지만 연산비용이 늘어나게 된다는 단점이 있다. scikit-learn에서 교차 검증은 model_selection 모듈의 cross_val_score라는 함수로 구현되어 있다. cross_val_score() cross_val_score(estimator,..

[scikit-learn 라이브러리] SVC (SVM)

SVM이란? SVM은 분류에 사용되는 지도학습 머신러닝 모델이다. SVM은 서포트 벡터(support vectors)를 사용해서 결정 경계(Decision Boundary)를 정의하고, 분류되지 않은 점을 해당 결정 경계와 비교해서 분류하게 된다. 기존의 퍼셉트론은 가장 단순하고 빠른 분류 모형이지만 결정경계가 유일하게 존재하지 않는다. 서포트 벡터 머신(SVM)은 퍼셉트론 기반의 모형에 가장 안정적인 결정 경계를 찾기 위해 제한 조건을 추가한 모형이라고 볼 수 있다. 서포트 벡터 : 클래스 사이 경계에 가깝게 위치한 데이터 포인트 (결정 경계와 이들 사이의 거리가 SVC 모델의 dual_coef_에 저장된다.) 커널 기법 데이터셋에 비선형 특성을 추가하면 선형 모델을 더 강력하게 만들 수 있음 하지만,..

[scikit-learn 라이브러리] BaggingClassifier (배깅분류기)

배깅 중복을 허용한 랜덤 샘플링으로 만든 훈련 세트(부트스트랩)를 사용하여 각 내부 모델을 다르게 학습시킴 분류기가 predict_proba() 메소드를 지원하는 경우 확률값을 평균하여 예측을 수행한다. (소프트보팅 차용) 없는 경우 가장 빈도가 높은 클래스 레이블이 예측 결과가 된다. (하드보팅 차용) 사용예제 from sklearn.model_selection import train_test_split from sklearn.datasets import load_breast_cancer # 데이터 로드 cancer = load_breast_cancer() X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, ra..

[scikit-learn 라이브러리] RandomForestClassifier (랜덤 포레스트 분류)

랜덤 포레스트(Random Forest) 기본 결정트리는 해당 데이터에 대해 맞춰서 분류를 진행한 것이기 때문에 과적합 현상이 자주 나타났다. 그에 따라 이를 개선하기 위해 2001년 앙상블 기법으로 고안된 것이 랜덤 포레스트이다. 훈련 과정에서 구성한 다수의 결정 트리들을 랜덤하게 학습시켜 분류 또는 회귀의 결과도출에 사용된다. 즉, 특정 특성을 선택하는 트리를 여러개 생성하여 이들을 기반으로 작업을 수행하는 것이다. 각각의 트리가 독립적으로 학습하기 때문에 학습과정을 병렬화할 수 있다. 일반적인 의사결정트리는 Tree Correlation이라고 하는 특정 feature 하나가 정답에 많은 영향을 주게되면 대부분의 결과치가 유사하게 나타나는 문제점이 있었다. 하지만 랜덤 포레스트에서는 그러한 문제를 해..

[scikit-learn 라이브러리] VotingClassifier (보팅 분류기)

보팅의 유형 하드 보팅 : 최종 아웃풋 결과 중 각 모델들이 가장많이 선택한 아웃풋을 최종 아웃풋으로 설정한다. 소프트 보팅 : 최종 아웃풋 결과의 확률값을 기반으로 평균을 내어, 이중 가장 확률값이 높은 아웃풋을 최종 아웃풋으로 설정한다. 보팅 분류기 모듈 사용예제 import pandas as pd from sklearn.datasets import load_breast_cancer from sklearn.model_selection import train_test_split cancer = load_breast_cancer() data_df = pd.DataFrame(cancer.data, columns = cancer.feature_names) # 데이터를 훈련셋과 테스트셋으로 나누기 X_trai..

[scikit-learn 라이브러리] DecisionTreeClassifier (결정트리분류기)

결정트리 분할과 가지치기 과정을 반복하면서 모델을 생성한다. 결정트리에는 분류와 회귀 모두에 사용할 수 있다. 여러개의 모델을 함께 사용하는 앙상블 모델이 존재한다. (RandomForest, GradientBoosting, XGBoost) 각 특성이 개별 처리되기 때문에 데이터 스케일에 영향을 받지 않아 특성의 정규화나 표준화가 필요 없다. 시계열 데이터와 같이 범위 밖의 포인트는 예측 할 수 없다. 과대적합되는 경향이 있다. 이는 본문에 소개할 가지치기 기법을 사용해도 크게 개선되지 않는다. DecisionTreeClassifier() DecisionTreeClassifier(criterion, splitter, max_depth, min_samples_split, min_samples_leaf, m..

[scikit-learn 라이브러리] KMeans (K-Means)

K - 평균 (K - means) 구현이 쉽고, 다른 군집 알고리즘에 비해 효율이 좋아 인기가 많은 알고리즘이다. 학계와 산업현장 모두에서 활용된다. 프로토 타입 기반 군집(각 클러스터가 하나의 프로토타입으로 표현됨)에 속한다. 프로토 타입 : 연속적 특성에서는 비슷한 데이터 포인트의 centroid(평균) / 범주형 특성에서는 medopid(가장 자주 등장하는 포인트) 몇개의 군집을 설정할 것인지 정해야한다는 다소 주관적인 사람의 판단이 개입된다. (K값 결정) K - 평균의 과정 1) 데이터 포인터에서 랜덤하게 k개의 센트로이드를 초기 클러스터 중심으로 선택한다. 2) 각 데이터를 가장 가까운 센트로이드에 할당한다. 3) 할당된 샘플들의 중심으로 센트로이드를 이동시킨다. 4) 클러스터 할당이 변하지 ..

[scikit-learn 라이브러리] LogisticRegression (로지스틱 회귀)

기본 이론 간단하면서도 파라미터의 수가 적어서 빠른 예측이 가능하다. 따라서 다른 알고리즘과의 비교 기준점으로 사용되기도 한다. 주로 $p = {1 \over 1+e^{−z}}$ 형태의 시그모이드 함수를 사용한다. z는 가중치 계산(선형)의 결과이다. 시그모이드 함수는 0~1까지의 결과만을 가지기 때문에 임의의 수에 대한 확률값을 도출해내기 적당하다. 아웃풋을 확률값으로 만들어서 이를 기반으로 데이터를 그룹으로 나눌 수 있다. 시그모이드 함수 # 가중치 이동 # W(a)값이 작을때 -> 클 때 def logreg(z): return 1 / (1 + np.exp(-z)) W_list = [0.3, 0.5, 1] b_list = [0] xx = np.linspace(-10, 10, 100) for W in ..

[scikit-learn 라이브러리] PolynomialFeatures (다항회귀)

다항회귀 import numpy as np import matplotlib.pyplot as plt %matplotlib inline n = 100 x = 6 * np.random.rand(n, 1) - 3 y = 0.5 * x**2 + x + 2 + np.random.rand(n, 1) plt.scatter(x, y, s=5) 위와 같은 데이터는 데이터의 분포가 곡선으로 나타나기 때문에 일반적인 선형회귀로 해결할 수 없다. (비선형) 따라서 다항 회귀를 사용한다. 다항회귀란 위와 같이 데이터들간의 형태가 비선형 일때 데이터에 각 특성의 제곱을 추가해주어서 특성이 추가된 비선형 데이터를 선형 회귀 모델로 훈련시키는 방법이다. 기본 과정 from sklearn.preprocessing import Poly..

[scikit-learn 라이브러리] iris 데이터셋 사용 예제

데이터 판단 import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns df = sns.load_dataset('iris') df ==결과== sepal_length sepal_width petal_length petal_width species 0 5.1 3.5 1.4 0.2 setosa 1 4.9 3.0 1.4 0.2 setosa 2 4.7 3.2 1.3 0.2 setosa 3 4.6 3.1 1.5 0.2 setosa 4 5.0 3.6 1.4 0.2 setosa .. ... ... ... ... ... 145 6.7 3.0 5.2 2.3 virginica 146 6.3 2.5 5.0 1.9 vi..