와 억만년만의 포스팅이다.

( 사실 네이버 블로그를 또 만들어서 잘 안들어오게 되는듯 ...)

절미하고! (ㅋㅋ) TabNet 설치는 사실 별거 없다.

 

참고 블로그 URL

https://slowsteadystat.tistory.com/23

 

[논문 리뷰] 정형 데이터를 위한 딥러닝 | Tabnet

이 글이 도움되셨다면 광고 클릭 부탁드립니다 : ) 2019년 구글에서 개발한 tabular data 분석을 위한 딥러닝 아키텍처인 Tabnet에 대해 간단하게 알아보겠습니다. 캐글이나 데이콘과 같은 여러 대회에

slowsteadystat.tistory.com

 

 

1. PyTorch 설치하기 ~

일단, TabNet를 사용하기 위해 pytorch를 설치해야한다.

pytorch를 설치하는건 그다지 어렵지 않고, 심지어 홈페이지에 가면 다 나와있는데

처음해보는 사람은 어려워서 헤매더라.. 근데 그럴 수 있다! 나도 그랬으니까 ㅎㅎ

 

PyTorch

 

pytorch.org

위 페이지에 들어가면 친절하게 홈페이지 첫 화면 맨 아래에 아래 사진과 같이 되어있다.

 

컴퓨터에 GPU가 있다면 CUDA를 선택해서 설치하면 되는거고

나는 노트북 사용 중인데, GPU가 없으므로 CPU를 선택해서 설치하려고 한다.

그렇게 항목을 클릭하면, 설치할 수 있는 command 문구를 만들어 준다. 

나는 Anaconda 가상환경을 만들어서 사용하기 때문에, 가상환경에 설치할 것임.

 

 

2. TabNet 설치하기 ~

 

pytorch-tabnet

PyTorch implementation of TabNet

pypi.org

위 페이지에 접속하면 뜨는 TabNet 설치 command 문구가 있다.

자신의 가상환경 or 환경에 설치하면 된다.

나는 Anaconda 에서 가상환경을 만들어서 사용하고 있기 때문에 아래 사진처럼 깔아주었다.

 

 

3. TabNet

 

TabNet: Attentive Interpretable Tabular Learning | Proceedings of the AAAI Conference on Artificial Intelligence

 

ojs.aaai.org

관련 논문 자료는 위 사이트에서 받아볼 수 있다. ㅎㅎ

 

 

[논문 리뷰] 정형 데이터를 위한 딥러닝 | Tabnet

이 글이 도움되셨다면 광고 클릭 부탁드립니다 : ) 2019년 구글에서 개발한 tabular data 분석을 위한 딥러닝 아키텍처인 Tabnet에 대해 간단하게 알아보겠습니다. 캐글이나 데이콘과 같은 여러 대회에

slowsteadystat.tistory.com

좀 어려울 수도 있어서 다른 곳에서 잘 설명해주더라.. 위 블로그를 읽으면서 이해가 좀 되었다.

 

 

GitHub - dreamquark-ai/tabnet: PyTorch implementation of TabNet paper : https://arxiv.org/pdf/1908.07442.pdf

PyTorch implementation of TabNet paper : https://arxiv.org/pdf/1908.07442.pdf - GitHub - dreamquark-ai/tabnet: PyTorch implementation of TabNet paper : https://arxiv.org/pdf/1908.07442.pdf

github.com

TabNet github이고, 관련 예제 코드를 받아볼 수 있다. 예시 코드 하나만 아래에 풀어보겠다.

from pytorch_tabnet.tab_model import TabNetClassifier
import torch
from sklearn.preprocessing import LabelEncoder
from sklearn.metrics import roc_auc_score
import pandas as pd
import numpy as np
np.random.seed(0)
import os
import wget
from pathlib import Path
from matplotlib import pyplot as plt

# download census-income dataset
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data"
dataset_name = 'census-income'
out = Path(os.getcwd()+'/data/'+dataset_name+'.csv')
out.parent.mkdir(parents=True, exist_ok=True)
if out.exists():
    print("File already exists.")
else:
    print("Downloading file...")
    wget.download(url, out.as_posix())


# load data and split
col_name = ['age','workclass','fnlwgt','education','education-num', 'marital-status', 'occupation' ,
            'relationship','race','sex','capital-gain','capital-loss','hours-pier-week','native-country',
            '<=50K']
train = pd.read_csv(out, names = col_name)
target = '<=50K'
if "Set" not in train.columns:
    train["Set"] = np.random.choice(["train", "valid", "test"], p =[.8, .1, .1], size=(train.shape[0],))

train_indices = train[train.Set=="train"].index
valid_indices = train[train.Set=="valid"].index
test_indices = train[train.Set=="test"].index


# simple preprocessing
nunique = train.nunique()
types = train.dtypes

categorical_columns = []
categorical_dims =  {}
for col in train.columns:
    if types[col] == 'object' or nunique[col] < 200:
        # print(col, train[col].nunique())
        l_enc = LabelEncoder()
        train[col] = train[col].fillna("VV_likely")
        train[col] = l_enc.fit_transform(train[col].values)
        categorical_columns.append(col)
        categorical_dims[col] = len(l_enc.classes_)
    else:
        train.fillna(train.loc[train_indices, col].mean(), inplace=True)
        
# Define categorical feature for categorical embeddings
unused_feat = ['Set']
features = [ col for col in train.columns if col not in unused_feat+[target]] 
cat_idxs = [ i for i, f in enumerate(features) if f in categorical_columns]
cat_dims = [ categorical_dims[f] for i, f in enumerate(features) if f in categorical_columns]

# define your embedding sizes : here just a random choice
cat_emb_dim = [5, 4, 3, 6, 2, 2, 1, 10]

# check that pipeline accepts strings
train.loc[train[target]==0, target] = "wealthy"
train.loc[train[target]==1, target] = "not_wealthy"

# network parameters
tabnet_params = {"cat_idxs":cat_idxs,
                 "cat_dims":cat_dims,
                 "cat_emb_dim":1,
                 "optimizer_fn":torch.optim.Adam,
                 "optimizer_params":dict(lr=2e-2),
                 "scheduler_params":{"step_size":50, # how to use learning rate scheduler
                                 "gamma":0.9},
                 "scheduler_fn":torch.optim.lr_scheduler.StepLR,
                 "mask_type":'entmax', # "sparsemax"
                 "gamma" : 1.3 # coefficient for feature reusage in the masks
                }

clf = TabNetClassifier(**tabnet_params)

# training
X_train = train[features].values[train_indices]
y_train = train[target].values[train_indices]

X_valid = train[features].values[valid_indices]
y_valid = train[target].values[valid_indices]

X_test = train[features].values[test_indices]
y_test = train[target].values[test_indices]

max_epochs = 100 if not os.getenv("CI", False) else 2

# This illustrates the warm_start=False behaviour
save_history = []
for _ in range(2):
    clf.fit(
        X_train=X_train, y_train=y_train,
        eval_set=[(X_train, y_train), (X_valid, y_valid)],
        eval_name=['train', 'valid'],
        eval_metric=['auc'],
        max_epochs=max_epochs , patience=20,
        batch_size=1024, virtual_batch_size=128,
        num_workers=0,
        weights=1,
        drop_last=False
    )
    save_history.append(clf.history["valid_auc"])

# plot losses
plt.plot(clf.history['loss'])

# plot auc
plt.plot(clf.history['train_auc'])
plt.plot(clf.history['valid_auc'])

# plot learning rates
plt.plot(clf.history['lr'])

# prediction
preds = clf.predict_proba(X_test)
test_auc = roc_auc_score(y_score=preds[:,1], y_true=y_test)


preds_valid = clf.predict_proba(X_valid)
valid_auc = roc_auc_score(y_score=preds_valid[:,1], y_true=y_valid)

print(f"BEST VALID SCORE FOR {dataset_name} : {clf.best_cost}")
print(f"FINAL TEST SCORE FOR {dataset_name} : {test_auc}")

# global
feat_importances = pd.Series(clf.feature_importances_, index=features)
feat_importances.plot(kind='barh')

#local
explain_matrix, masks = clf.explain(X_test)
fig, axs = plt.subplots(1, 3, figsize=(20,20))

for i in range(3):
    axs[i].imshow(masks[i][30:50])
    axs[i].set_title(f"mask {i}")

 

 

'프로그래밍 > Python' 카테고리의 다른 글

Support vector machine(SVM)  (0) 2023.03.27
Anaconda Prompt 명령어 정리  (0) 2023.01.09

터미널에 git bash 열고

끝~ .. 현타

 

똑똑한 녀석....

 

대충 실행 되었다는 이미지

 

github는 코드를 게시하는 곳이다. 코드의 버전을 관리할 수 있고, 포트폴리오로 사용된다. 협업을 위한 공간이 된다. github에 코드를 올리기 위해서는 GIT을 설치해야한다. 웹에 코드를 올리기 위해서는 GIT 코딩을 통해서 업로드 할 수 있다. 그래서 hub에 내 코드를 올리고 싶으면, git을 설치해야한다. 주절주절

 

1. 계정 생성 및 로그인

 

GitHub: Let’s build from here

GitHub is where over 100 million developers shape the future of software, together. Contribute to the open source community, manage your Git repositories, review code like a pro, track bugs and fea...

github.com

 

2. Git 설치,

설치 할 때 그 넥스트 넥스트 넥스트 함.

 

Git

 

git-scm.com

 

3. Git 설치 후 환경설정

4. repository 생성

위 사진에 있는 코드들은 코드를 hub에 보낼때 git에 쳐야하는 명령어들임.

 

5. 코드 업로드

- 예시 코드, html 파일

<html>
    <head>
        <meta charset="UTF-8">
        <title>로그인 박스</title>
        <style>
                th{
                    width: 50px;
                }
                td{
                    width: 50px;
                }
            </style>
    </head>
    <body>
        <fieldset>
        <table>
            <tr><!--행(row)선언-->
                <th ><b>ID</b></th>
                <th><input type="text" name = "UserID" value=""placeholder = "아이디를 입력 해주세요."/></th>
                <th rowspan="2"><input type="submit" value="로그인"/></th>
            </tr>
            <tr><!--행(row)선언-->
                <th><b>PW</b></th>
                <th><input type="password" name = "UserPW" value=""placeholder = "비밀번호를 입력 해주세요."/></th>
            </tr>
            <tr><!--행(row)선언-->
                <th colspan="3">
                    <a href="join.html" data-role="button">회원가입</a>
                    <input type="button" value="아이디/비번 찾기">
                </th>
            </tr>
        </table>
        </fieldset>

    </body>
</html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>회원가입 페이지</title>
        <style>
            td{
                width: 300px;
            }
        </style>
    </head>
    <body>
        <fieldset>
        <h2>회원가입</h2>
        <hr/>
        <table>
            <tr>
                <th>아이디</th>
                <td><input type="text" name = "UserID" value=""/></td>
            </tr>
            <tr>
                <th>비밀번호</th>
                <td><input type="text" name = "UserPW" value=""/></td>
            </tr>
            <tr>
                <th>비밀번호 확인</th>
                <td><input type="text" name = "ReUserPW" value=""/></td>
            </tr>
            <tr>
                <th>이름</th>
                <td><input type="text" name = "Name" value=""/></td>
            </tr>
            <tr>
                <th>이메일</th>
                <td><input type="email" name="mail" required/></td>
            </tr>
            <tr>
                <th>생년월일</th>
                <td>
                    <select name="year">
                        <option value="1995">1995</option>
                        <option value="1996"d>1996</option>
                        <option value="1997" selected>1997</option>
                        <option value="1998">1998</option>
                        <option value="1999">1999</option>
                        <option value="2000">2000</option>
                    </select>
                    <select name="month">
                        <option value="01" selected>01</option>
                    </select>
                    <select name="day">
                        <option value="01" selected>01</option>
                    </select>
                </td>
            </tr>
            <tr>
                <th>성별</th>
                <td>
                    <input type="radio" name="gender" value="male"/> 남자
                    &nbsp;&nbsp;&nbsp;&nbsp;
                    <input type="radio" name="gender" value="female"/> 여자
                </td>
            </tr>
            <tr>
                <th>취미</th>
                <td>
                    <input type="checkbox" name="hobby" value="드라이브"/>드라이브
                    <input type="checkbox" name="hobby" value="스포츠"/>스포츠
                    <input type="checkbox" name="hobby" value="게임"/>게임
                    <input type="checkbox" name="hobby" value="낚시"/>낚시
                </td>
            </tr>
            <tr>
                <th>나이</th>
                <td><input type="number" name="age" min="1" max="200" value="20"/></td>
            </tr>
            <tr>
                <th>보안등급</th>
                <td><input type="range" name="security" min="0" max="100" value="0" step="20"/></td>
            </tr>
        </table>
        </fieldset>
    </body>
</html>

 

- VSC 에서 Terminal > new Terminal

 

- VSC에서 터미널에 Git이 뜨지 않는 경우 !! 참조 : https://velog.io/@aldrn29/VScode-Git-bash

 

VSCode 터미널에 Git Bash 설정하기

어느 순간부터 VSCode 터미널이 Git Bash가 아닌 다른 환경으로 이용하고 있었다. 심지어 Git Bash가 안보이는거... 그래서 이왕 설정하는 김에 기본 터미널을 Git Bash로 하고자 했다.

velog.io

 

- Git bash Terminal에 다음과 같이 명령어 입력

 

6. 잘 올라갔는지 확인!

 

 

참조 URL : https://bkshin.tistory.com/entry/머신러닝-2서포트-벡터-머신-SVM

 

머신러닝 - 3. 서포트 벡터 머신 (SVM) 실습

sklearn을 활용하여 서포트 벡터 머신(SVM) 실습을 해보겠습니다. 코드 및 데이터는 제 깃헙에 모두 있습니다. 본 포스트의 내용은 OpenCV의 글을 정리한 것입니다. (Reference1) Linearly Separable Data without N

bkshin.tistory.com

 

SVM는 이진선형분류 모델. 마진을 최대화하는 분류 경계선을 제공.

분류해주는 방법은 위 포스팅에 따르면, 선형으로 하거나 커널 트릭을 통해 데이터를 고차원 공간으로 매핑해준 뒤 분류하고, 분류된 데이터를 다시 저차원 공간으로 매핑해준다.

SVM을 통해 분류된 데이터는 Margin와 robustness가 최대화 된다. 이때, Margine은 데이터를 분류하는 선(Linear)을 Decision Boundary의 좌우의 가장 가까운 데이터와의 거리를 의미한다. 이때, 가장 가까운 데이터를 Support Vector라고 한다. Robustness는 outlier에 영향을 받지 않는 것을 의미한다. outlier는 데이터 집단 내에서 다른 값과는 달리 크게 다른 데이터를 의미하는데, 이렇듯 데이터가 만들어내는 비슷한 흐름 사이에 튀는 outlier가 있어도 그 값을 무시하고 분류하기 때문에 Robustness가 최대화 된다고 말하는 것이다.

모든 데이터를 구분할 때에 매번 선형(linear)으로 구분짓는 것도 어려울테다. 데이터가 좌표상 혹은 다른 방식으로 표현됨에 있어서 무조건 선형의 Decision Boudary로 나누어질 수 없기 때문이다. 이 때에는 Kerneal Trick을 통해 데이터를 고차원 공간으로 매핑해준다. 

 

위 영상에서 보면 쉽게 이해할 수 있다.

왼쪽 사진의 경우, 데이터를 Linear한 Decision Boundary로 구분지을 수 없다. 누가봐도 Polynimai 하다. 이를 linear seperable하지 않다고 표현한다. 이러한 2차원의 데이터를 고차원 공간으로 매핑하는 과정을 가운데 사진과 오른쪽 사진으로 확인할 수 있다..

 고차원에서 매핑한 데이터에서 분류했다. 그리고 다시 저차원으로 매핑해 Seperate 할 수 있다. 위의 오른쪽 사진에서 그 결과물을 확인할 수 있다. 

 

그래서, 중요한 것은.. 이런 SVM을 어떻게 컴퓨터적으로 구현할 수 있을까?

 

서포트 벡터 머신 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 선형 SVM이 두 자료(흰색 원, 검은색 원)을 직선으로 분리하고 있다. 서포트 벡터 머신(support vector machine, SVM[1][2])은 기계 학습의 분야 중 하나로 패턴 인식, 자료

ko.wikipedia.org

이미 구현되어있다. 다양한 프로그래밍 언어에서 지원하고있는 서포터 벡터 머신 라이브러리가 있다. 사용하려는 언어에 따라서 라이브러리를 임포트하여 SVM 머신러닝 기법을 사용할 수 있다. 위의 위키백과에서 그 목록을 확인할 수 있다.

파이썬에서는 scikit-learn(사이킷런) 라이브러리를 통해 SVM을 구현할 수 있다. sklearn.svm.SVC 함수이다. 관련된 파라미터는 아래 사이트에서 확인할 수 있다.

 

sklearn.svm.SVC

Examples using sklearn.svm.SVC: Release Highlights for scikit-learn 0.24 Release Highlights for scikit-learn 0.24 Release Highlights for scikit-learn 0.22 Release Highlights for scikit-learn 0.22 C...

scikit-learn.org

 

 

파이썬 예제는 참조로 걸어둔 블로그에서 제공한 예시 파일을 사용하였다. 가장 쉬운 예제인 노이즈가 없을 때의 Linear seperatable data를 사용한 예제이다. 해당 데이터는 노이즈가 없다. 깔끔하게 Linear seperable 할 수 있다.

따라서 결과물도 이렇게 나온다. 여기서 주목할 것은 첫번째 training data의 decision boundary의 margin이다. decision boudary의 가장 가까운 파란색 점과 빨간색 점에서부터의 거리가 margin이다. 이후 다룰 노이즈가 있는 케이스에서는 margin을 C라는 파라미터를 다르게 함에 따라 margin을 크게 할지, 작게 할지 결정할 수 있다. noise가 많으면 C를 작게해서 margin을 크게 하고, noise가 적으면 C를 크게해서 margin을 작게 한다. 

 

두번째 예시는 노이즈가 존재할 때의 Linear seperatable data를 사용한 예제이다. 첫번째 사진을 보다시피, 파란색 점과 빨간색 점의 군집에 튀어있는 몇개의 oulier 데이터가 있다. 이 때에는 어떻게 처리할까? 이전에 언급했다시피 oulier는 무시한다. 그리고 파라미터 값을 어떻게 지정해주느냐에 따라서 Decision Boundary와 Margin에 따른 Accuracy가 정해진다.

C = 1
C = 100

C를 작게했을 때 정확도가 높은 것을 확인할 수 있다.

 

margin이 왜 중요할까?

SVM에서는 margin이 클수록 decision을 잘한다고 할 수 있는데, margin을 통해 일반화오차가 되는 노이즈를 정확히 표현하기 위함이다. 주어진 학습 데이터를 과다적합 할수록 더욱 SVM이 선형이 아닌 복잡한 비선형 구조가 된다. 이는 학습시, 노이즈까지 같이 학습시켰기 때문이다. 따라서, 노이즈는 학습시키지 않는 일정정도의 오차를 margin으로 둔 것이다. 이를 통해 일반화 오류를 줄이면서 데이터 판별의 정확도를 높일 수 있다.

위 사진을 통해 좀 더 쉽게 이해할 수 있다. 이 사진은 위의 코드에서 구현한 두번째 예시이다. margin을 최소화해서 데이터를 분리하면 위의 사진과 같이 Decision Boundary는 non-linear하게 되어지고, 이는 복잡한 비선형 구조가 된다. 이것을 Overfitting, 과적합하다고 표현한다. 훈련 데이터를 과도하게 하면 안된다는 것이다. SVM의 성능을 높이기 위해서는 마진을 잘 두어야한다는 것이다. 그래서 노이즈가 많은 경우 SVM의 파라미터인 C를 높게 주어 마진을 작게 주는 것이 좋다.

 

SVM의 수학적 이해는 아래 블로그를 통해 도움받을 수 있었다.

 

SVM (Support Vector Machine) Part 1

SVM (Support Vector Machine)은 Logistic Regression , Neural Network, Bayes classifier 같은 Linear classifier(초평면을 이용하는 분류기를 말함) 들 중에 하나이다. 분류상으로는 당연히Supervised Learning에 속한다.SVM 에서

gentlej90.tistory.com

 

 

참고로 마지막 사진의 Decision Boundary는 프로그램적으로 구현한 것이 아닌 내가 그린것이다. 하핫

 

'프로그래밍 > Python' 카테고리의 다른 글

TabNet 설치하기  (4) 2024.01.13
Anaconda Prompt 명령어 정리  (0) 2023.01.09

dktltvkf...

error : cv2.error: opencv(4.5.3) ~: error: (-2:unspecified error) the function is not implemented. rebuild the library with windows, gtk+ 2.x or cocoa support.

solution : https://stackoverflow.com/questions/57427233/module-cv2-cv2-has-no-attribute-ximgproc

 

Module 'cv2.cv2' has no attribute 'ximgproc'

I am trying to perform a selective search to an image using OpenCV but when I run my code I get this: >>> import cv2 >>> ss = cv2.ximgproc.segmentation.

stackoverflow.com

 

+ Recent posts