728x90

'''
사이킷런에서 제공하는 iris 데이터 사용
'''

import pandas as pd
from sklearn import datasets
from sklearn.model_selection import train_test_split
import numpy as np
import treeCreater
import treePlottter


iris = datasets.load_iris()
X = pd.DataFrame(iris['data'], columns=iris['feature_names'])
y = pd.Series(iris['target_names'][iris['target']])

# 3개의 샘플을 취해 테스트세트로 사용
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=15)

# 남은 120개 샘플 중에서 30개를 검정세트로 사용
X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size=0.25, random_state=15)


# 가지치기 않함
tree_no_pruning = treeCreater.DecisionTree('gini')
tree_no_pruning.fit(X_train, y_train, X_val, y_val)
print('가지치기 없음:', np.mean(tree_no_pruning.predict(X_test) == y_test))
# treePlottter.create_plot(tree_no_pruning.tree_)

# 사전 가지치기
tree_pre_pruning = treeCreater.DecisionTree('gini', 'pre_pruning')
tree_pre_pruning.fit(X_train, y_train, X_val, y_val)
print('사전 가지치기:', np.mean(tree_pre_pruning.predict(X_test) == y_test))
# treePlottter.create_plot(tree_pre_pruning.tree_)

# 사후 가지치기
tree_post_pruning = treeCreater.DecisionTree('gini', 'post_pruning')
tree_post_pruning.fit(X_train, y_train, X_val, y_val)
print('사후 가지치기:', np.mean(tree_post_pruning.predict(X_test) == y_test))
# treePlottter.create_plot(tree_post_pruning.tree_)

 

참고 답안: https://blog.csdn.net/red_stone1/article/details/106110620

728x90

Learning SQL.pdf
0.91MB

무료 SQL e-book이 있어 공유합니다.

제목은 Learning SQL

 

한빛미디어에서 출간된 <러닝 SQL>과는 다른 책입니다^^

http://www.yes24.com/Product/Goods/98388711

 

러닝 SQL - YES24

SQL 언어를 마스터하기 위한 필독서태어난 지 40년이 넘은 SQL의 쓰임새는 데이터 전성시대를 맞아 확장하고 있다. 이 책은 개발자가 SQL 기본을 빨리 익히고 데이터베이스 애플리케이션 작성, 관

www.yes24.com

 

번역서 중에 <데이터 분석을 위한 SQL 레시피> - 가사키 나가토, 다미야 나오토 를 유용하게 봤는데,

http://www.yes24.com/Product/Goods/59411396

 

데이터 분석을 위한 SQL 레시피 - YES24

현장에서 바로 써먹는 SQL 데이터 분석 실무 지침서 이 책은 집필진이 실제로 업무에서 작성했던 리포트나 SQL 코드를 범용화하여 정리한 지침서입니다. 데이터 집계와 가공, 매출 파악, 웹사이트

www.yes24.com

아무래도 유료 도서는 아니다보니 정리가 아주 깔끔하진 않지만, 

한번 훑어보기엔 괜찮은 책 같습니다.

 

위 예시처럼 SQL sever, SQLite, MySQL 등 다양한 SQL 예시를 보여주고 있다는 점, online 링크가 바로 연결된다는 점이 장점..

 

 

개인적으로 업무에 SQL를 파이썬만큼 자주 사용하진 않아서, 

한달 넘으면 까묵까묵...하더라고요.

 

그때는 https://sqlzoo.net/ SQL ZOO에서 몸풀기 한 번씩 하면 도움 되는 것 같습니다.

 

 

728x90

 

문제:

UCI 데이터 세트에서 4개의 데이터 세트를 선택하여, 위에서 언급한 세 가지 알고리즘이 생성한 가지치기를 하지 않은, 사전 가지치기를 한, 사후 가지치기를 한 의사결정 트리들에 대해 비교를 진행하고 통계적 유의미성을 검증하라.

 

UCI 데이터 세트 중 Wine Data Set 사용. 대략 180개의 데이터, 12개의 특성, 3가지 레이블(3가지 주종)이 있음. 랜덤 샘플링으로 140:40 으로 split함.

 

ID3 의사결정 트리:

 

CART(가지치기 없음):

CART(사전 가지치기):

 

CART(사후 가지치기):

 

사후 가지치기가 사전 가지치기보다 과적합 현상이 일어나기 쉬움을 알 수 있음.

 

728x90

 

파이썬 라이브러리가 잘 나오기 때문에 사실 이 부분을 구현하는 것이 의미가 있을까 싶네요.

이 문제에 대한 참고 답안은 별도로 올리지 않겠습니다.

파이썬에서 인자만 바꿔주면 해결되기 때문에;

 

실습에 편의를 위해 데이터셋은 중->영 변환해서 올려드립니다.

 

chapter4_dataset.csv
0.00MB

728x90

4.2 ‘최소 훈련 오차’를 사용하여 의사결정 트리 분할의 기준으로 삼을 때 빠질 수 있는 함정에 대해 분석하라.

 

참고 답안:

만약 최소훈련오차를 의사결정 트리 분할의 기준으로 사용한다면 훈련 데이터와 실제 데이터 사이에 (거의 대부분의 상황에서)일정한 편차(bias)가 존재할 것이기 때문에, 이렇게 얻어진 의사결정 트리는 과적합 상황을 일으켜 테스트 데이터에 대한 일반화 성능이 하락하게 될것이다. 

 

 

이 문제에 대해 아직 명확한 답을 찾진 못했습니다. '과적합'때문이라는 의견이 대부분이긴 하지만, 이에 대한 구체적인 증명은 찾지 못해서요. 개인적으로는 의사결정 트리는 information gain을 사용하던 지니인덱스를 사용하던 과적합 되기 쉬운 것으로 생각되서요. 

혹시 해당 부분에 대해 좋은 해답을 가지고 계시다면 댓글로 달아주세요~ 다른 분들과 함께 공유했으면 좋겠습니다:)

 

728x90

4.1:

충돌되는 데이터conflicting data(즉, 특성 벡터가 완전히 같지만 레이블은 다른)를 포함하지 않는 훈련 세트에 대해, 훈련 세트와 일치(훈련 오차가 0인)하는 의사결정 트리가 반드시 존재한다는 사실을 증명하라.

 

참고 답안1.

훈련 데이터셋과 일치하는 의사결정 트리가 존재하지 않는다고 가정한다면, 훈련 데이터셋으로 훈련해 얻은 의사결정 트리의 최소 한개의 노드상에 분할할 수 없는 데이터가 있어야한다(만약 노드상에 conflicting data가 없다면 해당 데이터는 분리 가능해야 한다). 이는 전제(충돌되는 데이터를 포함하지 않는다)와 모순되기 때문에 반드시 훈련데이터셋과 일치하는 의사결정 트리가 있어야 한다.

 

참고답안2.

 

단단한 머신러닝 책 그림4.2에 나오는 알고리즘 설명에 따르면, 노드를 생성하는 3가지 상황은 다음과 같다:

 

1,2,3 총 3가지 상황으로 정리가 가능한데, 

이 문제의 목적은 훈련 데이터셋과 일치하는 의사결정 트리를 찾는 것이기 때문에 3번째 포인트는 고려하지않아도 된다.  1,2,번 상황만 고려하면 의사결정 트레에서 가지가 잎 노드 생성을 멈출 때는 샘플이 모두 같은 클래스에 속하거나 모든 특성(feature)을 다 사용했을 때이다. 그렇다면 잎노드 레이블과 실제 훈련셋이 다를 경우는 특성을 모두 다 사용한 상황일 것이다. 하지만 훈련셋에 충돌 데이터가 없다고 했기 때문에 각 노드상에 훈련 오차는 모두 0이 된다.

728x90

책까지는 아니지만,

numpy 연습 문제라고 정리된 자료가 있는데,

해외 기업 ML포지션에서 비슷한 문제를 몇 개 풀었던 기억이 있어 올려봅니다.

 

100 numpy exercises.pdf
0.25MB

 

728x90

 

Data pipeline을 직접 구현해야할 일이 생겨, 책을 찾다가 도움을 많이 받았던 책입니다.

info.unraveldata.com/lp-oreilly-report-reliable-data-pipelines.html

 

O'Reilly Report: Rebuilding Reliable Data Pipelines Through Modern Tools | Unravel

Rebuilding Reliable Modern Data Pipelines Using AI and DataOps

info.unraveldata.com

위 주소에 메일주소만 입력하면 무료로 다운받을 수 있습니다:)

 

서칭을 하다가 데이터 파이프라인 관련 책을 소개한 블로그에서 발견을 했는데 (kadensungbincho.tistory.com/14),

 

해당 블로거님의 설명처럼 데이터 파이프라인을 운영하다가 마주하는 기술과 데이터 문제를 데이터 파이프라인의 각 단계별로 기술해 전반적인 내용을 파악할 수 있도록 한 것같습니다.

 

총 페이지 수가 많지않아 훑어 보는데 부담이 없어요.

 

요즘은 개인적인 업무가 데이터 통합이나 데이터 파이프라인 구축, 데이터를 활용한 실험을 위한 플랫폼 구축에 포커스가 맞춰져있어서...

혹시 관련해서 괜찮은 책 있으면 더 추천 부탁드립니다.

 

728x90

 

참고답안:

단단한 머신러닝 3.3 참고

 

OvR,  MvM은 각 클래스에 동일한 처리를 하기 때문에 이진 분류 문제에서 클래스 불균형 영향이 상쇄되는 경향이 있다. 따라서 일반적으로 추가적인 처리를 진행하지 않아도 된다.

 

728x90

3.7 코드 길이가 9이고, 클래스 수가 4일 때 해밍턴 거리로 이론 최적의 ECOC 이진코드와 이에 대한 증명을 기술하라.

 

참고답안:

책에서 해당 부분에 대한 내용을 명확하게 설명하고 있지 않기 때문에,

원문(논문)인 《Solving Multiclass Learning Problems via Error-Correcting Output Codes》를 참조하라.

원문에서는 코드를 구성하는 몇 가지 방법에 대해 설명하고 있는데, 그 중 하나는 다음과 같다.

클래스 수가 4일때 가능한 코드는 7가지가 있다. 위 방법에 따르면,

표와 같아지고, 코드 길이가 9일때 f6 이후에 어떤 두 코드를 더해도 최적의 코드가 된다. 이때 임의로 추가되는 코드는 모두 이전 코드의 반대 코드가 되기때문에, 클래스 사이의 최소 해밍턴 거리는 모두 4가 되며 증가되지 않는다.

 

 

+ Recent posts