카테고리 보관물: Machine Learning

핸즈온 머신러닝 주피터 노트북 업데이트 안내

핸즈온 머신러닝의 원서 주피터 노트북이 조금 업데이트되었습니다. 변경된 내용을 번역서의 깃허브에도 반영하였습니다. 다음은 변경된 상세 내용입니다.

  • 14_recurrent_neural_networks.ipynb
    • 레버(Reber) 문법 연습문제에서 my_reber_classifier의 경로를 변경하고 추정 확률을 퍼센트로 나타냅니다.
      with tf.Session() as sess:
      saver.restore(sess, "my_reber_classifier")
      y_proba_val = y_proba.eval(feed_dict={X: X_test, seq_length: l_test})
      
      print()
      print("레버 문자열일 추정 확률:")
      for index, string in enumerate(test_strings):
      print("{}: {:.2f}%".format(string, y_proba_val[index][0]))

      을 다음으로 변경합니다.

      with tf.Session() as sess:
      saver.restore(sess, "./my_reber_classifier")
      y_proba_val = y_proba.eval(feed_dict={X: X_test, seq_length: l_test})
      
      print()
      print("레버 문자열일 추정 확률:")
      for index, string in enumerate(test_strings):
      print("{}: {:.2f}%".format(string, 100 * y_proba_val[index][0]))
  • 02_end_to_end_machine_learning_project.ipynb
    • 사이킷런의 0.20 버전에 포함될 ColumnTransformer를 사용하면 책의 예제에서처럼 DataFrameSelectorFeatureUnion을 사용하지 않고 간단히 전체 파이프라인을 만들 수 있습니다. 아직 사이킷런 0.20 버전이 릴리스되기 전이므로 여기서는 future_encoders.pyColumnTransformer를 넣어 놓고 사용합니다.
      from future_encoders import ColumnTransformer
      
      num_attribs = list(housing_num)
      cat_attribs = ["ocean_proximity"]
      
      full_pipeline = ColumnTransformer([
      ("num", num_pipeline, num_attribs),
      ("cat", OneHotEncoder(), cat_attribs),
      ])
      
      housing_prepared = full_pipeline.fit_transform(housing)
      housing_prepared
  • 11_deep_learning.ipynb
    • 텐서플로 모델 재사용하기에서 노드 이름 수정
      hidden3 = tf.get_default_graph().get_tensor_by_name("dnn/hidden4/Relu:0")

      을 다음으로 변경합니다.

      hidden3 = tf.get_default_graph().get_tensor_by_name("dnn/hidden3/Relu:0")
  • 11_deep_learning_exercises.ipynb
    • 불필요한 변수 초기화 루틴 삭제
      for var in output_layer_vars: 
          var.initializer.run()
  • extra_tensorflow_reproducibility.ipynb 파일 추가

감사합니다! 🙂

TensorFlow 1.10.0 RC0 Release

텐서플로 1.10 RC 버전이 릴리즈되었습니다. 1.9버전이 나온지 정말 며칠되지 않았는데 말이죠. 1.10버전부터 NVIDIA NCCL 2.2 버전을 사용합니다. 2개 이상의 GPU를 사용하는 경우 NCCL 라이브러리를 업데이트해야 합니다. 텐서플로 1.10 RC 버전은 pip 명령을 사용해 설치할 수 있습니다.

$ pip install --upgrade --pre tensorflow
$ pip install --upgrade --pre tensorflow-gpu

(업데이트) RC1 버전이 릴리즈되었습니다.

사이킷런도 0.20 버전을 준비중입니다. 아마 가을에는 릴리즈되지 않을까 생각됩니다.

최근 사이킷런에서 리팩토링된 코드 중에서 습관적으로 사용하던 np.ones(), np.zeros()np.full()로 바꾼 것이 눈에 띄입니다. 무심코 다음처럼 비효율적인 코드를 쓰게 됩니다.

np.ones((3,2)) * -1

다음과 같이 쓰는게 훨씬 직관적이고 효율적입니다. 🙂

np.full((3,2), -1.)

“핸즈온 머신러닝” 주피터 노트북 업데이트 안내

핸즈온 머신러닝“의 3장, 11장 주피터 노트북이 조금 업데이트되었습니다.

  • 3장: 연습문제 3번의 답에 서포트 벡터 머신과 랜덤 포레스트의 결과를 박스 플롯(boxplot)으로 비교하는 셀이 추가되었습니다. 다음 스샷을 참고해 주세요.

  • 11장: SELU 활성화 함수에 대한 설명이 보강되었습니다. 다음 스샷을 참고해 주세요.


감사합니다! 🙂

[핸즈온 머신러닝] 업데이트 안내해 드립니다.

핸즈온 머신러닝” 도서의 수정 사항에 대해 안내해 드립니다. 최근 원서 깃허브에 여러가지 내용이 추가 되어서 이를 번역서 깃허브에 반영하였습니다. 본문 내용에 영향이 있는 것은 에러타로 등록하였습니다. 도서를 구매하셨다면 꼭 확인 부탁드립니다. 주요한 변경 사항은 다음과 같습니다.

  • 7장의 연습문제 8, 9번의 답이 추가되었습니다.
  • 16장의 연습문제 8번의 답이 추가되었습니다.
  • 2장 3장에 범주형 변수의 인코딩을 위해 OrdinalEncoder와 OneHotEncoder를 사용하는 예가 추가되었습니다(사이킷런 0.20에 추가될 예정인 CategoricalEncoder가 두 개의 클래스로 리팩토링되었습니다). 그리고 두 클래스를 future_encoders.py 로 분리했습니다.
  • 2장에 신뢰 구간을 구하는 예가 추가되었습니다.
  • 7장에 XGBoost 예가 추가되었습니다.
  • 10장에 tf.contrib.learn 외에 tf.estimator를 사용한 예가 추가되었습니다.
  • 12장에 tf.data 를 사용한 예가 추가되었습니다.
  • 16장에 넘파이 배열을 사용한 재현 메모리 구현 예가 추가되었습니다.
  • tf.examples.tutorials.mnist 가 deprecated 될 예정이므로 Keras에 포함된 MNIST 함수를 사용하도록 바꾸었습니다.
  • 텐서보드를 주피터 노트북에 표현하기 위해 추가했던 코드를 tensorflow_graph_in_jupyter.py 파일로 분리했습니다.
  • 9장에 있던 자동 미분 예를 extra_autodiff.ipynb로 분리했습니다. 이 노트북의 번역을 완료하여 업데이트했습니다.

아직 번역하지 못한 extra 노트북이 여러개 남아 있습니다. 꾸준히 작업하고 있으니 조금만 기다려 주세요. 감사합니다!

머신러닝 Yearning 01~27

앤드류 응Andrew Ng 박사가 쓰고 있던 머신러닝 Yearning이 잠시 업데이트가 없었습니다. 코세라Courseradeeplearning.ai 강좌 때문이었다고 하네요. 강의 개발을 모두 끝내고 나서 다시 드래프트 버전을 업데이트하고 있습니다. 총 55개의 챕터가 쓰여질 예정인데 현재 27개의 챕터가 완료되었습니다. 아직 못 보신 분 들을 위해 지금까지 업데이트된 PDF를 모아서 블로그에 올려 놓았습니다!(다운로드) 🙂

(업데이트) 28~30장이 릴리즈되었습니다!(Ng_MLY05), 31~32장이 릴리즈되었습니다!(Ng_MLY06), 33-35장이 릴리즈되었습니다!(Ng_MLY07), 36-39장이 릴리즈되었습니다!(Ng_MLY08), 40~43장이 릴리즈되었습니다!(Ng_MLY09), 44~46장이 릴리즈되었습니다!(NG_MLY10), 47~49장이 릴리즈되었습니다!(NG_MLY11), 50~52장이 릴리즈되었습니다!(Ng_MLY12)

‘핸즈온 머신러닝’이 출간되었습니다.

b9267655530_lHands-On Machine Learning with Scikit-Learn & TensorFlow의 번역서 ‘핸즈온 머신러닝‘이 출간되었습니다!

그 동안 이 작업을 하면서 많은 것을 배웠습니다. 모쪼록 다른 누군가에게도 도움이 된다면 다행입니다.

원래 번역서 제목이 ‘사이킷런과 텐서플로를 활용한 머신러닝, 딥러닝 실무’ 정도로 예상되었는데 출간 직전에 ‘핸즈온 머신러닝’으로 변경되었습니다. 개인적으로는 단순하고 평소에도 부르는 이름이라 만족입니다. 🙂 혹시 이 책에 관해 궁금한 점 있으면 언제든지 댓글이나 메일 주세요.

마지막으로 책을 만드는 데 도움을 주신 많은 분들께 다시 한번 감사드립니다.

(저자 오렐리앙도 아주 기뻐하네요. ㅎ)

결정 트리와 불순도에 대한 궁금증

이 글은 세바스찬 라쉬카의 머신러닝 FAQ 글(Why are implementations of decision tree algorithms usually binary and what are the advantages of the different impurity metrics?)을 번역한 것입니다.

결정 트리 알고리즘은 왜 이진 트리로 구현되어 있을까요? 각 불순도 지표들의 장점은 무엇인가요?

현실적인 이유로(조합의 폭발적인 증가combinatorial explosion) 대부분의 라이브러리들은 결정 트리를 이진 트리로 구현합니다. 좋은 점은 이진 트리가 NP-완전 문제NP-complete라는 것입니다(Hyafil, Laurent, and Ronald L. Rivest. “Constructing optimal binary decision trees is NP-complete.” Information Processing Letters 5.1 (1976): 15-17.).

(CARTClassification And Regression Tree 알고리즘의) 목적 함수는 각 분할에서 정보 이득information gain(IG)을 최대화하는 것입니다:

IG(D_p, f) = I(D_p) - \sum_{j=1}^{m}\dfrac{N_j}{N}I(D_j)

는 분할에 사용되는 특성이고 D와 D는 각각 부모 노드와 번째 자식 노드의 데이터셋입니다. 는 불순도 지표입니다. N 은 샘플의 전체 개수이고 Njj 번째 자식 노드의 샘플 개수입니다. 이제 분류에서 가장 널리 사용되는 (CART 알고리즘의) 분할 기준을 살펴 보겠습니다. 간단하게 이진 분할로 식을 표현하지만 당연히 다중 분할로 일반화될 수 있습니다. 이진 분할에 대한 IG 는 다음과 같이 계산합니다:

IG(D_p, a) = I(D_p) - \dfrac{N_{left}}{N}I(D_{left}) - \dfrac{N_{right}}{N}I(D_{right})

이진 결정 트리에서 가장 널리 사용되는 불순도 지표 또는 분할 기준은 지니 불순도Gini impurity(IG)와 엔트로피Entropy(IH)와 분류 오차Classification Error(IE)입니다. 엔트로피의 정의부터 살펴보죠. 다음과 같습니다.

I_H(t) = - \sum_{i=1}^c p(i|t)\,log_2\,p(i|t)

클래스에 샘플이 하나라도 있다면

p(i|t) \ne 0

이고 p(i|t) 는 특정 노드 t 에서 클래스 c 에 속한 샘플의 비율입니다. 그러므로 한 노드의 샘플이 모두 동일한 클래스에 속한다면 엔트로피는 0입니다. 클래스 별로 균등하게 분포되어 있다면 당연하게 엔트로피는 최대가 됩니다. 지니 불순도는 잘 못 분류될 확률을 최소화시키려는 기준으로 생각할 수 있습니다.

I_G(t) = \sum_{i=1}^c p(i|t)(1-p(i|t)) = 1 - \sum_{i=1}^c p(i|t)^2

엔트로피와 비슷하게 지니 불순도는 클래스가 균일하게 섞여 있을 때 최대가 됩니다. 그러나 실제로 지니 불순도와 엔트로피는 매우 비슷한 결과를 만들며 불순도 기준을 사용하여 트리를 평가하는데 시간을 들이는 것보다 가지치기pruning 방식을 바꿔보는 것이 더 낫습니다. 또 다른 불순도 지표는 분류 오차입니다.

I_E = 1 - \text{max}\{ p(i|t) \}

가지치기에는 좋은 지표지만 노드의 클래스 확률 변화에 덜 민감하기 때문에 결정 트리를 구성하는데는 적합하지 않습니다.

overview-plot

분류 오차가 클래스 확률 변화에 왜 덜 민감한지 보기 위해 다음 그림에서 두 개의 분할 사례를 살펴 보겠습니다.

split

클래스 1에 40개의 샘플, 클래스 2에 40개의 샘플을 가진 부모 노드의 데이터셋 Dp 를 각각 두 개의 데이터셋 Dleft 와 Dright 로 나누었습니다. 분류 오차를 분할 기준으로 사용했을 때 정보 이득은 AB 의 경우 모두 같습니다(IGE = 0.25):

I_E(D_p) = 1 - \text{max}(0.5 + 0.5) = 0.5

A:

I_E(D_{left}) = 1 - \text{max}(0.75, 0.25) = 0.25

I_E(D_{right}) = 1 - \text{max}(0.25, 0.75) = 0.25

IG_E = 0.5 - \dfrac{40}{80}\times0.25-\dfrac{40}{80}\times0.25 = 0.25

B:

I_E(D_{left}) = 1 - \text{max}(\dfrac{20}{60},\dfrac{40}{60}) = \dfrac{1}{3}

I_E(D_{right}) = 1 - \text{max}(1, 0) = 0

IG_E = 0.5 - \dfrac{60}{80}\times\dfrac{1}{3}-\dfrac{20}{80}\times0 = 0.25

하지만 지니 불순도 기준의 IG는 A(0.125) 보다 B(0.1666) 가 더 순수하기 때문에 높습니다.

I_G(D_p) = 1 - (0.5^2 + 0.5^2) = 0.5

A:

I_G(D_{left}) = 1 - \left( \left(\dfrac{3}{4}\right)^2 + \left(\dfrac{1}{4}\right)^2 \right) = \dfrac{3}{8} = 0.375

I_G(D_{right}) = 1 - \left( \left(\dfrac{1}{4}\right)^2 + \left(\dfrac{3}{4}\right)^2 \right) = \dfrac{3}{8} = 0.375

IG_G = 0.5 - \dfrac{40}{80}\times0.375 - \dfrac{40}{80}\times0.375 = 0.125

B:

I_G(D_{left}) = 1 - \left( \left(\dfrac{2}{6}\right)^2 + \left(\dfrac{4}{6}\right)^2 \right) = \dfrac{4}{9}

I_G(D_{right}) = 1 - \left( \left(\dfrac{2}{2}\right)^2 + \left(\dfrac{0}{2}\right)^2 \right) = 1 - 1 = 0

IG_G = 0.5 - \dfrac{60}{80}\times\dfrac{4}{9} - \dfrac{40}{80}\times0 = 0.1666

비슷하게 엔트로피 기준은 A(0.19) 보다 B(0.31)를 선호합니다.

I_H(D_p) = - (0.5\,log_2\,(0.5) + 0.5\,log_2(0.5)) = 1

A:

I_H(D_{left}) = - \left( \dfrac{3}{4}\,log_2\left(\dfrac{3}{4}\right) + \dfrac{1}{4}\,log_2\left(\dfrac{1}{4}\right) \right) = 0.81

I_H(D_{right}) = - \left( \dfrac{1}{4}\,log_2\left(\dfrac{1}{4}\right) + \dfrac{3}{4}\,log_2\left(\dfrac{3}{4}\right) \right) = 0.81

IG_H = 1 - \dfrac{40}{80}\times0.81 - \dfrac{40}{80}\times0.81 = 0.19

B:

I_H(D_{left}) = - \left( \dfrac{2}{6}\,log_2\left(\dfrac{2}{6}\right) + \dfrac{4}{6}\,log_2\left(\dfrac{4}{6}\right) \right) = 0.92

I_H(D_{right}) = - \left( \dfrac{2}{2}\,log_2\left(\dfrac{2}{2}\right) + \dfrac{0}{2}\,log_2\left(\dfrac{0}{2}\right) \right) = 0

IG_G = 1 - \dfrac{60}{80}\times0.92 - \dfrac{40}{80}\times0 = 0.31

지니 불순도와 엔트로피에 대해 덧붙이자면 위에 언급한 것처럼 만들어진 트리는 실제 매우 비슷합니다. 지니 불순도의 장점은 로그를 계산할 필요가 없어서 구현 성능이 조금 더 낫다는 것입니다.

옮긴이: 위 그림을 보면 엔트로피보다 지니 불순도 방식이 불순도 값을 줄이기 위해 더 클래스 확률을 낮추어야 함을 알 수 있습니다. 즉 엔트로피 방식이 조금 더 균형잡힌 트리를 만들 가능성이 높습니다. scikit-learn의 DecisionTreeClassifier와 DecisionTreeRegressor 및 이들을 사용하는 랜덤 포레스트와 그래디언트 부스팅에서 특성 중요도 속성은(feature_importances_) 트리가 분할에 사용한 특성별로 발생되는 모든 정보 이득을 더하고 전체 특성 중요도의 합이 1이 되도록 정규화한 것입니다.

다중 평가 지표: cross_validate()

Scikit-Learn 0.19 버전에 추가된 새로운 기능 시리즈 마지막으로 다중 평가 지표에 대해 알아보겠습니다. 다중 평가 지표란 말 그대로 모델을 평가할 때 여러개의 지표를 이용할 수 있다는 뜻입니다. 0.19 버전에 새롭게 추가된 cross_validate() 함수가 이 기능을 제공합니다.

5.3.5절과 유사한 예제를 만들어 보겠습니다. 먼저 숫자 데이터셋을 불러들여 타깃을 9로 하는 이진 분류 문제로 데이터셋을 훈련 세트와 테스트 세트로 나눕니다.

digits = load_digits()
X_train, X_test, y_train, y_test = train_test_split(
    digits.data, digits.target == 9, random_state=42)

지금까지 교차 검증에 사용했던 cross_val_score() 함수를 훈련 세트에 적용해 보겠습니다. 분류 모델은 SVC()를 사용합니다.

사이킷런 0.20 버전에서 SVC ​클래스의 gamma 매개변수 옵션에 auto외에 scale이 추가되었습니다. auto는 1/n_features, 즉 특성 개수의 역수입니다. scale은 1/(n_features * X.std())로 스케일 조정이 되지 않은 특성에서 더 좋은 결과를 만듭니다. 사이킷런 0.22 버전부터는 gamma 매개변수의 기본값이 auto에서 scale로 변경됩니다. 서포트 벡터 머신을 사용하기 전에 특성을 표준화 전처리하면 scale과 auto는 차이가 없습니다. 경고를 피하기 위해 명시적으로 auto 옵션을 지정합니다.

사이킷런 0.22 버전에서 cross_val_score 함수와 GridSearchCV 클래스의 cv 매개변수 기본값이 3에서 5로 바뀔 예정입니다. 0.20 버전에서 cv 매개변수를 지정하지 않는 경우 이에 관한 경고 메세지가 출력됩니다. 경고 메세지를 피하기 위해 cv 매개변수 값을 명시적으로 3으로 지정합니다.

from sklearn.svm import SVC
cross_val_score(SVC(gamma='auto'), X_train, y_train, cv=3)
array([0.90200445, 0.90200445, 0.90200445])

cross_val_score() 함수는 scoring 매개변수에 원하는 평가 지표를 지정할 수 있습니다. 분류 문제일 경우 기본은 정확도를 의미하는 ‘accuracy’입니다. 따라서 다음 코드는 위와 동일한 결과를 출력합니다.

cross_val_score(SVC(gamma='auto'), X_train, y_train, scoring='accuracy' cv=3)

여러개의 평가 지표를 사용하려면 새롭게 추가된 cross_validate() 함수를 사용합니다. cross_val_score()와 마찬가지로 scoring 매개변수에서 평가 지표를 지정할 수 있습니다. 여러개의 평가 지표를 지정하려면 리스트로 만들어 전달하면 됩니다. 이 함수는 디폴트 설정에서 테스트 폴드에 대한 점수 뿐만 아니라 훈련 폴드에 대한 점수도 반환합니다. 향후 버전에서 기본으로 훈련 폴드 점수가 반환되지 않는다는 경고 메세지가 출력되므로 return_train_score 매개변수에서 명시적으로 훈련 폴드의 점수를 받을지 여부를 설정하는 것이 좋습니다.

from sklearn.model_selection import cross_validate
cross_validate(SVC(gamma='auto'), X_train, y_train, 
               scoring=['accuracy', 'roc_auc'], 
               return_train_score=True)
{'fit_time': array([0.07761502, 0.07732582, 0.07719207]),
 'score_time': array([0.06746364, 0.06803942, 0.06800795]),
 'test_accuracy': array([0.90200445, 0.90200445, 0.90200445]),
 'test_roc_auc': array([0.99657688, 0.99814815, 0.99943883]),
 'train_accuracy': array([1., 1., 1.]),
 'train_roc_auc': array([1., 1., 1.])}

이 함수는 각 폴드에서 훈련과 테스트에 걸린 시간을 반환하고 scoring 매개변수에 지정한 평가 지표마다 훈련 점수와 테스트 점수를 반환합니다. 훈련 점수와 테스트 점수를 반환된 딕셔너리에서 추출하려면 ‘train_XXXX’, ‘test_XXXX’와 같은 스타일의 키를 사용하면 됩니다.

사실 0.19 버전부터는 cross_val_score() 함수도 cross_validate()를 사용합니다. 그래서 다음 코드는 cross_val_score() 함수와 동일한 결과를 반환합니다.

cross_validate(SVC(gamma='auto'), X_train, y_train, 
               scoring=['accuracy'], cv=3,
               return_train_score=False)['test_accuracy']

cross_validate() 함수의 scoring 매개변수에 리스트 대신 딕셔너리로 평가 지표를 전달할 수 있습니다. 딕셔너리의 키는 임의의 문자열이 가능합니다. 이렇게 하면 결과 딕셔너리의 키 이름을 간략하게 나타낼 수 있습니다. 다음과 같이 씁니다.

cross_validate(SVC(gamma='auto'), X_train, y_train, 
               scoring={'acc':'accuracy', 'ra':'roc_auc'}, 
               return_train_score=False, cv=3)
{'fit_time': array([0.07760668, 0.07740569, 0.07696486]),
 'score_time': array([0.06791329, 0.06786489, 0.06783247]),
 'test_acc': array([0.90200445, 0.90200445, 0.90200445]),
 'test_ra': array([0.99657688, 0.99814815, 0.99943883])}

평가 지표 mean_squared_error 같이 긴 이름을 자주 참조해야 한다면 이름을 간소하게 나타내는 것이 좋을 것 같습니다.

다중 평가 지표는 cross_validate()는 물론 그리드서치에서도 사용할 수 있습니다. GridSearchCV()의 scoring 매개변수도 마찬가지로 리스트 또는 딕셔너리로 설정할 수 있습니다. 다만 평가 지표를 리스트나 딕셔너리로 설정하려면 refit 매개변수에서 어떤 평가 지표로 선택한 최종 모델을 학습할 것인지 지정해야 합니다.

param_grid = {'gamma': [0.0001, 0.01, 0.1, 1, 10]}
grid = GridSearchCV(SVC(), param_grid=param_grid, 
                    scoring=['accuracy'], refit='accuracy',
                    return_train_score=True, cv=3)
grid.fit(X_train, y_train)

최적의 파라미터와 교차 검증 점수를 출력해 보겠습니다.

grid.best_params_
{'gamma': 0.0001}
grid.best_score_
0.9651076466221232

gamma가 0.0001이 선택되었습니다. 전체 교차 검증 결과를 출력해 보기 위해서 판다스의 DataFrame으로 만든 다음 넘파이로 행과 열을 바꾸겠습니다(컬럼 제목을 좌측에 놓기 위해서입니다).

np.transpose(pd.DataFrame(grid.cv_results_))

스크린샷 2018-03-13 오후 4.34.44.png

확실히 gamma가 0.0001일 때 mean_test_accuracy가 가장 높습니다. 이제 roc_auc를 추가해 그리드서치를 실행해 보겠습니다.

grid = GridSearchCV(SVC(), param_grid=param_grid, 
                    scoring={'acc':'accuracy', 'ra':'roc_auc'}, refit='ra',
                    return_train_score=True, cv=3)
grid.fit(X_train, y_train)

최적의 파라미터와 교차 검증 점수를 출력합니다.

grid.best_params_
{'gamma': 0.01}
grid.best_score_
0.9983352038907595

앞에서와 같이 교차 검증 결과를 출력해 보겠습니다. accuracy와 roc_auc에 대해 모두 점수가 출력되므로 꽤 긴 출력이 됩니다. 위에서처럼 gamma가 0.0001일 때는 mean_test_acc가 가장 높지만 gamma가 0.01일 때는 mean_test_ra가 제일 높습니다. refit 매개변수를 ‘ra’로 주었기 때문에 최적 파라미터와 최종 모델은 gamma가 0.01입니다.

스크린샷 2018-03-13 오후 4.37.26

grid.best_estimator_
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
  decision_function_shape='ovr', degree=3, gamma=0.01, kernel='rbf',
  max_iter=-1, probability=False, random_state=None, shrinking=True,
  tol=0.001, verbose=False)

이 글의 샘플 코드는 ‘파이썬 라이브러리를 활용한 머신러닝‘ 깃허브(https://github.com/rickiepark/introduction_to_ml_with_python/blob/master/cross_validate.ipynb)에서 확인할 수 있습니다.

구글의 머신러닝 단기집중과정

구글에서 “머신러닝 단기집중과정“이란 온라인 교육 사이트를 오픈했습니다. 머신러닝의 기초와 선형회귀, 로지스틱 회귀에서부터 신경망으로 MNIST 이미지를 분류하는 것까지 다루고 있습니다(텐서플로와 여러 파이썬 과학 라이브러리를 사용합니다). 강의에서 제공되는 실습은 Colab의 Notebook을 이용하고 있어 온라인에서 바로 실습을 할 수 있습니다. 재미있는 것은 강의 영상이 한국어 더빙으로 제공됩니다.

머신러닝으로 만든 더빙과 몇몇 용어의 선택이 조금 어색하지만 누구나 무료로 들을 수 있는 한국어로 된 좋은 강의인 것 같습니다. 🙂

스크린샷 2018-03-01 오전 11.37.52