<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>leo_kim.log</title>
        <link>https://velog.io/</link>
        <description>🤿 deep in data</description>
        <lastBuildDate>Wed, 05 Oct 2022 07:49:04 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>leo_kim.log</title>
            <url>https://velog.velcdn.com/images/leo_kim/profile/e8e32a23-4a05-4675-93fa-39f4093a1690/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. leo_kim.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/leo_kim" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[data&ML] R2 (결정계수)가 크면 Error(오차)가 작나요?]]></title>
            <link>https://velog.io/@leo_kim/dataML-R2-%EA%B0%80-%ED%81%AC%EB%A9%B4-Error%EA%B0%80-%EC%9E%91%EB%82%98%EC%9A%94</link>
            <guid>https://velog.io/@leo_kim/dataML-R2-%EA%B0%80-%ED%81%AC%EB%A9%B4-Error%EA%B0%80-%EC%9E%91%EB%82%98%EC%9A%94</guid>
            <pubDate>Wed, 05 Oct 2022 07:49:04 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>R-squared (결정계수) 값이 크면, Error가 작아질까요?</p>
</blockquote>
<p>결정계수와 오차, Hmm.. 둘의 관계가 어떻게 될까
일단 둘은 회귀모델의 평가지표이다.</p>
<h3 id="r2-결정계수">R^2 (결정계수)</h3>
<p>$$
R^2 = 1-\frac{( \displaystyle\sum(오차 ^2))}{(\displaystyle\sum(편차^2))}
$$
오차 = 실제값 - 예측값
편차 = 실제값 - 평균값</p>
<p>수식을 통분하여 해석해보면, 
{(편차제곱합)-(오차제곱합)} / (편차제곱합)
이 되니깐,</p>
<blockquote>
<p>평균값으로 예측한 것보다 오차를 얼마나 줄였어? </p>
</blockquote>
<p>라고 할 수 있다.</p>
<p>수식을 보면 오차가 작으면 <code>R^2</code> 값이 커지긴한다. </p>
<h3 id="mse-mae와의-관계">MSE, MAE와의 관계</h3>
<p>사실 모델의 성능을 평가할 때  <code>MSE(Mean Squared Error)</code>를 사용한다면 <code>R^2</code> 가 커질 때 MSE는 작아질 것이다. 둘다 제곱합으로 계산하기 때문!</p>
<p>하지만 모델 성능 지표로써 <code>MAE(Mean Absolute Error)</code>를 사용한다면 <code>R^2</code> 가 큰 모델이더라도 MAE가 작을 수 있다. 무조건 &#39;error&#39;가 작아지는 것이 아니다. </p>
<p>간단하게 생각해보면 MAE는 절대값의 합을 구하는 것이고, <code>R^2</code> 는 오차의 제곱합을 구하기 때문에 달라질 수 있겠다. </p>
<p>(실제값-예측값)으로 0~1 사이 값이 포함된다면 제곱과 절대값을 취하는 과정에서 경향성이 달라지는 것이다. </p>
<p>간단한 내용이지만 고민해보면서,</p>
<blockquote>
<p>모델 성능 평가 지표로 어떤 것을 선택하는지, 수식이 어떻게 생겼더라 한번 더 생각해보는 것의 중요성을 다시금 리마인드 해보았다 😊</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[data&ML] t-test 와 ANOVA의 은밀한 관계]]></title>
            <link>https://velog.io/@leo_kim/dataML-t-test-%EC%99%80-ANOVA%EC%9D%98-%EC%9D%80%EB%B0%80%ED%95%9C-%EA%B4%80%EA%B3%84</link>
            <guid>https://velog.io/@leo_kim/dataML-t-test-%EC%99%80-ANOVA%EC%9D%98-%EC%9D%80%EB%B0%80%ED%95%9C-%EA%B4%80%EA%B3%84</guid>
            <pubDate>Mon, 03 Oct 2022 07:25:58 GMT</pubDate>
            <description><![CDATA[<h2 id="t-test와-anova는-어떤-관계인가">t-test와 ANOVA는 어떤 관계인가?</h2>
<p><del>일단 이름만 보면 전혀 닮지 않았다..</del>
먼저 Independent Sample t-test 와 ANOVA를 먼저 비교해보자.</p>
<blockquote>
<p>공통점 먼저 알아보자.</p>
</blockquote>
<ol>
<li>가설을 검증하는 통계적 방법이다. </li>
<li>적용할 수 있는 상황에 대한 가정이 동일하다.
 a. 랜덤 샘플링을 통해 얻은 샘플이다.
 b. <strong>등분산</strong>: 비교하려는 집단들의 분산이 동일<pre><code> (등분산이 아니면 Welch&#39;s t-test)</code></pre> c. <strong>정규성</strong>: 샘플이 뽑힌 모집단은 정규분포를 따름<pre><code> (정규성은 Shapiro-wilk normality test 혹은 Q-Q plot, Histogram으로 확인)</code></pre> d. <strong>독립성</strong>: 그룹간 서로 독립<pre><code> (독립성을 가정하지 못하면 Paired Sample t-test)</code></pre></li>
</ol>
<blockquote>
<p>차이점은 표로 정리해보자.</p>
</blockquote>
<table>
<thead>
<tr>
<th align="center">/</th>
<th align="center">t-test</th>
<th align="center">ANOVA</th>
</tr>
</thead>
<tbody><tr>
<td align="center">정의</td>
<td align="center">두 모집단의 평균을<br>비교하는 가설 검증 방법</td>
<td align="center">3개 이상의 모집단의 평균을 <br>비교하는 가설 검증 방법</td>
</tr>
<tr>
<td align="center">Null<br>Hypothesis</td>
<td align="center">H0: µ(x) = µ(y)</td>
<td align="center">H0: All population means <br>are the <strong>same</strong></td>
</tr>
<tr>
<td align="center">Alternative<br>Hypothesis</td>
<td align="center">H1: µ(x) ≠ µ(y)</td>
<td align="center">H1:<br> At least one population mean<br> is <strong>different</strong></td>
</tr>
</tbody></table>
<p>검증하려는 가설을 보면 명확하다.
t-test는 두 집단의 평균이 같은지 다른지를 보려는 것이고, ANOVA는 세 집단 이상이 있을 때 평균이 같은지 다른지를 보려는 것이다. </p>
<h2 id="다른-t-test">다른 t-test</h2>
<p>사실 t-test는 종류가 많다.</p>
<ol>
<li>One Sample t-test: 그룹이 1개일 때, 알고있는 모집단의 평균이 맞는지 검증</li>
</ol>
<ul>
<li>(예시) 애플은 맥북의 무게가 1.24Kg이라고 알려져있다. 애플의 주장이 신뢰할 만한지 샘플을 가져와서 검정을 진행해보려 할 때.</li>
</ul>
<ol start="2">
<li>Paired Sample t-test: 같은 항목에 대해서 짝지어진 데이터가 존재할 때 얻은 두 관측치의 평균을 비교한다.</li>
</ol>
<ul>
<li>(예시) Independent가 그냥 남녀의 체온을 비교한다고 하면, Paired는 부부의 체온을 비교한다고 생각하자. </li>
</ul>
<h2 id="3개-그룹일-때-t-test를-세-번-하면-안되나요">3개 그룹일 때 t-test를 세 번 하면 안되나요?</h2>
<p>네.. 곤란합니다.. 
한 번 t-test를 했을 때 1종오류를 저지를 확률이 (유의수준 5% 일 때) 5% 인 것인데, 3번 하게되면 14.3%까지 1종오류 확률이 커지게 된다. (=0.95^3)</p>
<ul>
<li>1종오류: 실제로는 H0이 맞는데, H0를 기각해버릴 확률 (신중하지 못함!)</li>
<li>3개의 집단 예시로 들자면, 실제로는 차이가 없는데 차이가 있다고 결론을 내려버리는 것.<blockquote>
<p>그룹이 3개 이상일 때는 1종오류를 피하기 위해 ANOVA를 사용한다.</p>
</blockquote>
</li>
</ul>
<h2 id="anova-사후검정">ANOVA 사후검정</h2>
<p>3개의 그룹이 다르다는 것은 알겠는데,,, 
어떤 애들이 다르다는거지? 
에 대한 답은 사후검정(Post-hoc)을 통해 알 수 있다.
대표적으로 몇가지만 소개하자면,</p>
<ol>
<li>Tukey</li>
</ol>
<ul>
<li>집단 별 표본수가 동일할 때 사용하는 것으로 고안됐지만 현재는 집단수가 다르면 Tukey-Kramer를 사용</li>
<li>모든 집단 조합에 대해 분석</li>
</ul>
<ol start="2">
<li>Duncan</li>
</ol>
<ul>
<li>Tukey와 마찬가지로 집단 별 표본수가 동일할 때.</li>
<li>가장 loose한 방법</li>
</ul>
<ol start="3">
<li>Scheffe</li>
</ol>
<ul>
<li>집단 별 표본수가 달라도 됨</li>
<li>가장 보수적인 사후검정</li>
</ul>
<blockquote>
<p>구체적으로 어떻게 다른지는 아직 잘 이해하지 못했다. Scheffe &gt; Tukey &gt; Duncan 정도로 민감하다는 점 // 추후에 조금 더 찾아보고 업데이트 예정!</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[data&ML] 부스팅 계열 앙상블 알고리즘 (Part. 1)]]></title>
            <link>https://velog.io/@leo_kim/%EB%B6%80%EC%8A%A4%ED%8C%85-%EA%B3%84%EC%97%B4-%EC%95%99%EC%83%81%EB%B8%94-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98</link>
            <guid>https://velog.io/@leo_kim/%EB%B6%80%EC%8A%A4%ED%8C%85-%EA%B3%84%EC%97%B4-%EC%95%99%EC%83%81%EB%B8%94-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98</guid>
            <pubDate>Sun, 18 Sep 2022 15:05:05 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>왜 XGBoost, LightGBM 모델을 사용하셨나요?</p>
</blockquote>
<p>이 글은 위 질문에 대해 단순히 </p>
<blockquote>
<p>트리 부스팅 계열의 알고리즘이 Tabular 데이터에 좋기 때문에 사용했어요~</p>
</blockquote>
<p>라고 답하지 않기 위해 작성하기로 했다. </p>
<hr>
<h2 id="먼저-앙상블">먼저 앙상블,</h2>
<p>질문에 답하기 위해서는 먼저 알아야할 개념이 있다. 
부스팅과 앙상블. </p>
<p><strong>앙상블</strong> 먼저 짚고 넘어가자.</p>
<blockquote>
<p>Ensemble(앙상블)
여러 개의 약한 모델(weak learner)을 활용하여 강력한 모델(strong learner)을 만드는 방법</p>
</blockquote>
<p>당연하게도 여러가지 방법으로 앙상블을 시도할 수 있다. </p>
<ul>
<li><p><strong>Voting</strong></p>
<ul>
<li>여러 개의 모델이 투표를 통해 최종 결과를 결정한다 (일반적으로 서로 다른 알고리즘 사용)</li>
<li>사용하는 데이터 셋은 모두 같다</li>
<li>Hard voting: 다수의 모델이 예측한 결과값을 최종 결과로 선정한다</li>
<li>Soft voting: 각 모델이 계산한 확률을 평균하여 가장 확률이 높은 결과물을 최종 결과로 선정한다</li>
</ul>
</li>
<li><p><strong>Bagging</strong> (Bootstrap Aggregating)</p>
<ul>
<li>데이터 샘플을 여러 번 뽑아서 (bootstrap sampling, 중복 허용) 모델을 학습시킨 후 결과를 집계하는 방법</li>
<li>이 때의 모델은 모두 같은 모델, 학습하는 데이터가 다름
<img src="https://velog.velcdn.com/images/leo_kim/post/7c4a32e9-47c8-4ebd-96b7-c158b0159d5b/image.png" alt=""></li>
<li>모델의 variance는 줄이고, overfitting을 줄여준다 <del>(사실 같은말)</del></li>
<li>대표적으로 random forest</li>
</ul>
</li>
</ul>
<ul>
<li><p><strong>Boosting</strong> </p>
<ul>
<li>여러 개의 모델이 순차적으로 학습을 수행한다</li>
<li>이전 모델이 틀린 데이터에 대해 가중치를 부여하기 때문에 더 높은 예측 성능을 기대할 수 있다
<img src="https://velog.velcdn.com/images/leo_kim/post/c9a920d7-148b-4c13-a51a-613af123581c/image.png" alt=""></li>
<li>성능이 좋지만 속도가 느리고 overfitting이 발생할 가능성이 존재한다</li>
<li>대표적으로 XGBoost, LightGBM</li>
</ul>
</li>
<li><p><strong>Stacking</strong></p>
<ul>
<li>여러 모델이 예측한 결과를 가지고 meta 모델이 새로 예측하는 방법</li>
</ul>
</li>
</ul>
<hr>
<p>앙상블에 여러가지 방법이 있는 것은 알았고, 그 중에서 XGBoost와 LightGBM이 속한 부스팅 계열의 앙상블 알고리즘에 대해 자세히 보자.</p>
<h2 id="그-중에서-부스팅-boosting">그 중에서 부스팅 Boosting</h2>
<p>대표적인 4가지 Boosting 앙상블이 어떻게 작동하는지 알아보자</p>
<ol>
<li>AdaBoost</li>
<li>GradientBoost</li>
<li>XGBoost</li>
<li>LightGBM</li>
</ol>
<h3 id="1-adaboost-adaptive-boosting">#1 AdaBoost (Adaptive Boosting)</h3>
<p>1995년 고안된 방법, <a href="https://www.youtube.com/watch?v=LsK-xG1cLYA">유튜브 영상</a>
node 하나에 2 개의 leaf를 가진 트리를 stump라고 한다.
피쳐를 하나만 쓴다는 것!</p>
<p align = "center">
<img src="https://velog.velcdn.com/images/leo_kim/post/db02e0fa-5afd-4a0b-8312-379106b1b78f/image.png" width="200">
  <figcaption align = "center">
    Single Stump /
    <i>Source: StatQuest</i>
  </figcaption>
</p>

<p>AdaBoost는 가중치가 있는 stump들을 모아둔 모델이다.
(random forest는 리프가 여러개인 full tree)</p>
<p align = "center">
<img src="https://velog.velcdn.com/images/leo_kim/post/4947c976-1636-4995-b504-ce5d05fde7f6/image.png" width="300">
  <figcaption align = "center">
    Stumps with different weights /
    <i>Source: StatQuest</i>
  </figcaption>
</p>

<h4 id="algorithm">Algorithm</h4>
<p>1) 처음에는 모든 데이터의 sample weight를 동일하게 두고 stump를 만들어 각 stump의 지니계수를 계산한다.
2) 지니계수가 가장 작은 (=잘 분류해낸) stump가 첫 stump로 선정된다.
3) 첫 stump에서 잘못 분류한 샘플에 대해서는 sample weight가 커지게 되고, 잘 분류해낸 샘플에 대해서는 sample weight가 작아지게 된다.
4) 업데이트 한 sample weight를 가진 데이터에서 데이터를 중복을 허용하여 샘플링하는데, sample weight가 큰 샘플은 확률적으로 더 많이 뽑히게 된다.
5) 뽑힌 sample에 대해 다시 모든 sample weight를 동일하게 두고 1번 과정을 반복한다.</p>
<h3 id="2-gradient-boost">#2 Gradient Boost</h3>
<p>출처 <a href="https://www.youtube.com/watch?v=3CC4N4z3GJc&amp;list=PLblh5JKOoLUJjeXUvUE0maghNuY2_5fY6">유튜브 영상</a></p>
<p>AdaBoost에서 stump의 weight가 달라지면서 학습이 진행됐다면,
Gradient Boost는 leaf가 많은 형태의 tree를 사용한다.
(일반적으로 8~32 leaves)
그리고 tree들의 가중치는 모두 같다.</p>
<blockquote>
<p>아주아주 요약하자면, 예측하려는 데이터들의 Y값을 모두 Y값의 평균이라고 두고 그 차이를 줄여나가는 방식으로 학습한다.</p>
</blockquote>
<h4 id="algorithm-1">Algorithm</h4>
<ol>
<li>먼저 예측하고자 하는 Y값의 평균을 구한다.</li>
<li>각 데이터들의 실제 Y값과 평균값의 차이인 &#39;residual&#39;을 계산한다.<p align="center">
<img src="https://velog.velcdn.com/images/leo_kim/post/3672a5e1-5188-44e3-b9a3-1956ef98d34c/image.png" width = "400">
</p></li>
<li>residual값에 따라 데이터를 분류하는 decision-tree를 생성한다.<p align="center">
<img src="https://velog.velcdn.com/images/leo_kim/post/c740a308-f7e1-497b-b8ae-4b97be7d0cd2/image.png" width = "300">
</p>
(여기서 hyperparameter 로써 max_num_leaves를 제한하여 학습과정을 제어할 수 있다)</li>
<li>같은 leaf로 들어간 데이터의 residual을 그들의 평균값으로 대체한다.
(-14.2, -15.2 --&gt; -14.7)<p align="center">
<img src="https://velog.velcdn.com/images/leo_kim/post/9b7715f2-a77f-4270-9d9d-79c48b0d562e/image.png" width = "300">
</p></li>
<li>첫 예측값인 Average 값에 첫번째로 만들어진 decision-tree의 residual 값을 가중치 (learning-rate)를 곱하여 새로운 예측값을 계산한다.<p align="center">
<img src="https://velog.velcdn.com/images/leo_kim/post/2db4ad60-3dd6-45aa-9b24-540c708c8b15/image.png" width = "500">
</p></li>
<li>이제는 (1)단계에서 average로 모든 예측값을 초기화했었던 것처럼 (5)단계에서 계산한 새로운 예측값을 이용하여 residual = (observed-predicted) 을 계산한다. residual 값이 점점 작아질 것이다!<p align="center">
<img src="https://velog.velcdn.com/images/leo_kim/post/1fbace91-9919-45f8-9eee-b1769d668347/image.png" width = "500">
</p></li>
<li>새로운 residual을 기반으로 (3)단계 부터 과정을 반복한다. </li>
<li>처음 average 예측값에 이전 트리를 더한 값에 새로운 트리까지 더해서 또 다른 예측값을 계산해낸다. </li>
<li>위 과정을 반복한다.</li>
<li>한 번의 사이클마다 residual 크기가 작아진다. <p align="center">
<img src="https://velog.velcdn.com/images/leo_kim/post/6f4b1f8d-a5bb-4521-bda3-707f15cc3b74/image.png" width = "500">
<figcaption align="center">
<b>Source: StatQuest YouTube</b>
</figcaption>
</p>

</li>
</ol>
<blockquote>
<p>나머지 XGBoost 와 LightGBM 은 Part.2에서 계속...</p>
</blockquote>
<hr>
<h3 id="cf-the-bias-and-variance-of-a-classifier">(cf) The bias and variance of a classifier</h3>
<p>모델의 bias와 variance는 뭐지?? <a href="https://web.archive.org/web/20150119081741/http://oz.berkeley.edu/~breiman/arcall96.pdf">Leo Breiman, 1996</a>
= 모델이 내어놓는 prediction 들의 bias(예측값과 실제값의 차이)와 variance(예측값들이 얼마나 흩어져있는지)를 얘기하는 것 
쉬운 한글 설명은 <a href="https://opentutorials.org/module/3653/22071">여기</a></p>
<hr>
<h4 id="reference">Reference</h4>
<ul>
<li><a href="https://teddylee777.github.io/scikit-learn/scikit-learn-ensemble">머신러닝 앙상블</a></li>
<li><a href="https://www.youtube.com/c/joshstarmer">StatQuest YouTube</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Tips for ML] 머신러닝을 위한 M2 맥북에어 (애플 실리콘) 세팅하기]]></title>
            <link>https://velog.io/@leo_kim/Tips-for-ML-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D%EC%9D%84-%EC%9C%84%ED%95%9C-M2-%EB%A7%A5%EB%B6%81%EC%97%90%EC%96%B4-%EC%95%A0%ED%94%8C-%EC%8B%A4%EB%A6%AC%EC%BD%98-%EC%84%B8%ED%8C%85%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@leo_kim/Tips-for-ML-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D%EC%9D%84-%EC%9C%84%ED%95%9C-M2-%EB%A7%A5%EB%B6%81%EC%97%90%EC%96%B4-%EC%95%A0%ED%94%8C-%EC%8B%A4%EB%A6%AC%EC%BD%98-%EC%84%B8%ED%8C%85%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sun, 18 Sep 2022 14:11:08 GMT</pubDate>
            <description><![CDATA[<p>최근에 M2맥북에어를 구입하고, 드디어 로컬에서 파이썬을 써야할 일이 생겨 설치해보려고 한다. </p>
<h2 id="homebrew">Homebrew</h2>
<p>맥북에서 파이썬 설치는 처음이기 때문에 홈브루 부터 설치하자.
<a href="https://brew.sh">Hombrew</a>
위 링크를 타고 들어가 Install 부분의 코드를 복사하고 터미널에 붙여 넣어 하라는 대로 하면 된다. (비밀번호 입력, 엔터, 그리고 기다림...) 5분 정도 기다린 것 같다.
<img src="https://velog.velcdn.com/images/leo_kim/post/23fcc06f-f76b-4c4f-bd2a-dc3e9c13ca08/image.png" alt=""></p>
<pre><code class="language-python">/bin/bash -c &quot;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)&quot;</code></pre>
<p><img src="https://velog.velcdn.com/images/leo_kim/post/6c99d7dd-b8cb-4152-b84b-50a49158326f/image.png" alt=""></p>
<blockquote>
<p>Homebrew 설치완료</p>
</blockquote>
<h2 id="miniforge">MiniForge</h2>
<p>다음은 conda를 설치해야 하는데, 애플실리콘 환경에서는 MiniForge를 사용하라고 한다. 
위에서 homebrew를 성공적으로 설치했다면
<code>cmd+k</code> 를 입력하여 터미널 초기화! (꿀팁)
<code>brew install miniforge</code> 를 입력하여 설치 진행하자.</p>
<p>여기서 <code>zsh: command not found: brew</code> 메시지가 뜬다면
<code>% eval $(/opt/homebrew/bin/brew shellenv)</code> 이렇게 입력한 후 miniforge를 설치하면 해결된다. 
<img src="https://velog.velcdn.com/images/leo_kim/post/589c9876-4fc2-4c20-9946-e311efea63e9/image.png" alt=""></p>
<blockquote>
<p>MiniForge 까지 설치 완료!</p>
</blockquote>
<h2 id="shell-설정">Shell 설정</h2>
<p><code>conda init zsh</code> 명령어를 입력한다. 
터미널을 종료했다가 다시 들어와보면, 
<img src="https://velog.velcdn.com/images/leo_kim/post/93344b1a-1818-41d9-97ec-0e91255cc05a/image.png" alt="">
(base) 가 추가돼있을 것이다. </p>
<h2 id="jupyter-notebook-설치">Jupyter Notebook 설치</h2>
<p>주피터 노트북은 간단하게 pip install로 할 수 있다.
<code>pip install jupyter</code></p>
<h3 id="추가-scikit-learn-설치">추가 Scikit Learn 설치</h3>
<p>conda 명령어로 설치가능하다. 
<code>conda install scikit-learn</code></p>
<blockquote>
<p>설치 끝!</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Tips for ML] Jupyter Notebook 원격 접속하기 / 주피터노트북 연구실 pc]]></title>
            <link>https://velog.io/@leo_kim/Tips-for-ML-Jupyter-Notebook-%EC%9B%90%EA%B2%A9-%EC%A0%91%EC%86%8D%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@leo_kim/Tips-for-ML-Jupyter-Notebook-%EC%9B%90%EA%B2%A9-%EC%A0%91%EC%86%8D%ED%95%98%EA%B8%B0</guid>
            <pubDate>Thu, 01 Sep 2022 13:34:27 GMT</pubDate>
            <description><![CDATA[<p>기존에는 연구실 윈도우 pc에 원격 접속하여 리소스를 사용했는데, 앱을 통해서 접속하는 과정이 번거로웠었다. 이상하게도 외부 인터넷 환경에서는 접속도 안되고,, 새로운 방법을 찾아나섰다!</p>
<blockquote>
<p>코드 중간에 나오는 CAPS_ONLY 대문자로 이뤄진 부분은 사용하는 환경 따라 다른, 다르게 설정해줘야하는 부분입니다.</p>
</blockquote>
<h2 id="jupyter-notebook-원격접속-세팅하기">Jupyter Notebook 원격접속 세팅하기</h2>
<h3 id="anaconda">Anaconda</h3>
<ol>
<li>Config 파일 생성 </li>
</ol>
<ul>
<li>Anaconda Prompt를 실행한다</li>
<li><code>jupyter notebook --generate-config</code> 입력</li>
<li>위 명령어를 입력하면 평소 사용하던 노트북 디렉토리에 <code>jupyter_notebook_config.py</code> 파일이 생성될 것이다.</li>
<li>저자의 경우는 <code>C:\Users\USER_NAME\.jupyter</code> 이었다. </li>
</ul>
<ol start="2">
<li>노트북 암호 설정</li>
</ol>
<ul>
<li>Anaconda prompt 에서 ipython 입력 (config 파일 수정하는 방법도 있긴한데, 아마 같은 과정)</li>
<li><code>from notebook.auth import passwd</code> 입력</li>
<li><code>passwd()</code> 입력</li>
<li>설정하고 싶은 비밀번호 입력, verify 에도 동일하게 입력</li>
<li><strong>긴 문자열로 된 ssh 값을 복사해두자</strong></li>
<li><code>quit()</code> 입력</li>
</ul>
<ol start="3">
<li>config 파일 수정</li>
</ol>
<ul>
<li>1번 과정에서 만들어진 <code>jupyter_notebook_config.py</code> 을 워드패드로 연다</li>
<li>아래 코드 블럭에 있는 부분들을 찾아서 주석을 해제한 후 (# 부분) 수정한다</li>
<li>수정해야할 부분들이 붙어있진 않아서 ctrl+f로 찾아서 하면 빠르다</li>
</ul>
<pre><code>#c.NotebookApp.ip = &#39;localhost&#39;         (수정 전)
c.NotebookApp.ip = &#39;*&#39;                    (이렇게 되도록 수정)

#c.NotebookApp.password = &#39;&#39;
c.NotebookApp.password = &#39;sha1:SHA_VALUES&#39; (2에서 복사해둔 값)

#c.NotebookApp.password_required = False
c.NotebookApp.password_required = True

#c.NotebookApp.port = 8888
c.NotebookApp.port = YOUR_PORT_NUMBER    (설정하고 싶은 포트번호 5자리 숫자)</code></pre><h3 id="방화벽-허물어주기">방화벽 허물어주기</h3>
<p>실제로 허무는 정도는 아니고, 방화벽 설정이 필요하다 (다른 블로그에서는 이 부분이 설명이 안된 글이 많던데 저자의 경우 위까지 했는데 잘 안됐었다..)</p>
<ol>
<li>윈도우 키를 눌러 &#39;방화벽&#39; 검색하면 &#39;방화벽 상태 확인&#39; 메뉴를 선택</li>
<li>&#39;고급 설정&#39; 선택</li>
<li>&#39;인바운드 규칙&#39;에서 &#39;새 규칙&#39; 선택</li>
<li>&#39;포트&#39; 선택</li>
<li>&#39;TCP&#39; 선택 후 &#39;특정 로컬 포트&#39; 선택, 3에서 본인이 설정한 포트번호 5자리 숫자 입력</li>
<li>&#39;연결 허용&#39; 선택</li>
<li>&#39;도메인&#39;, &#39;개인&#39;, &#39;공용&#39; 모두 선택</li>
<li>&#39;이름&#39;에 본인이 설정하고 싶은 이름 입력하고 마침 (ex. Jupyter_notebook_remote)</li>
<li>jupyter notebook 재시작</li>
</ol>
<h3 id="실제-접속하려면">실제 접속하려면</h3>
<p>이제 설정은 끝났고, 실제 원격으로 접속할 때는 아래 내용을 해주면 접속이 될 것이다.</p>
<ol>
<li>원격을 제공할 pc의 Anaconda prompt 실행</li>
<li><code>jupyter notebook --ip=YOUR_IP</code> 본인 pc의 IP 주소를 입력해주면 된다</li>
<li>원격으로 접속하려는 기기에서 웹 브라우저 실행</li>
<li>주소창에 <code>YOUR_IP:YOUR_PORT_NUMBER</code> 입력한다</li>
<li>본인이 설정한 비밀번호를 입력하면 된다!</li>
</ol>
<p>맥북으로 잘 사용하는 중입니다!
<img src="https://velog.velcdn.com/images/leo_kim/post/e7678ab2-7968-44ef-9294-1cce4abba01b/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[KAX Ep.3] TabNet baseline - Kaggle AMEX]]></title>
            <link>https://velog.io/@leo_kim/KAX-Ep.3-TabNet-baseline-Kaggle-AMEX</link>
            <guid>https://velog.io/@leo_kim/KAX-Ep.3-TabNet-baseline-Kaggle-AMEX</guid>
            <pubDate>Wed, 17 Aug 2022 11:00:46 GMT</pubDate>
            <description><![CDATA[<p>2022.08.17 현재 4,560팀 5,575명이 75,221번의 제출 엔트리를 통해 참여하고 있다. 
대회 종료까지는 8일이 남았고, </p>
<p>우리 팀은 46등, 은메달 권에 위치해있다. 며칠째 0.800 점수에서 벗어나지 못하고 있다.... 
0.001점을 올려 금메달권에 가고자 여러가지 방법을 시도중이고, 새로운 모델로서 TabNet을 고려하게 되었다. </p>
<p>한 번도 접하지 못한 모델이라 논문과 여러 요약본, 베이스라인 코드를 보면서 공부하고 적용해보고자 한다. </p>
<p>출처 논문의 링크는 <a href="https://arxiv.org/pdf/1908.07442.pdf">여기</a></p>
<h2 id="tabular-data--dl">Tabular data &amp; DL?</h2>
<p>AMEX 캐글에서 다루는 데이터는 Tabular 데이터라고 할 수 있다. 쉽게 생각하면 엑셀에서 row &amp; column으로 표현될 수 있는 데이터이다. 자세한 설명은 <a href="https://www.statology.org/tabular-data/#:~:text=In%20statistics%2C%20tabular%20data%20refers,represent%20attributes%20for%20those%20observations.">여기</a>.</p>
<p>현재 참여하는 데이터의 특성상 딥러닝보다는 전통적인? Tree 계열의 앙상블 모델이 우수하다고 알려져있다. <del>배울때는 대략적으로 이해했는데, 다시 고민해보게 되었다.</del></p>
<h3 id="why-tree">Why Tree?</h3>
<p>트리 기반 앙상블을 사용하는 이유</p>
<ol>
<li>분류/회귀 문제를 해결할 때 경계를 결정하기 쉽다. </li>
<li>학습시키기에 빠르고 쉽다.</li>
<li>높은 해석력 (feature importance)
위 3가지로 요약될 수 있다. </li>
</ol>
<h3 id="why-deep-learning-in-tabular-data">Why Deep-learning in Tabular data?</h3>
<p>그렇다면 위 3가지 장점을 딥러닝의 장점과 결합하면 더 좋은 성능을 가지지 않을까 하는 시도인 것 같다. </p>
<p>딥러닝의 장점을 결합시킨다면,</p>
<ol>
<li>전처리, 피쳐엔지니어링 없이 학습 가능하다.</li>
<li>딥러닝 모델에 해석력을 부여하자 (Sequential Attention Mechanism 적용)</li>
</ol>
<blockquote>
<p>좋다는 것은 실제 데이터에 적용해보면 알게될 것 같다..!</p>
</blockquote>
<h2 id="architecture">Architecture</h2>
<p>실제 TabNet이 어떻게 구성돼있는지 이해해보고 AMEX 데이터로 베이스라인을 돌려보자. </p>
<p><img src="https://velog.velcdn.com/images/leo_kim/post/8595adf7-f03f-4b14-be3b-56e683041153/image.png" alt="">
전체적인 구조를 봤을 때 (논문 제목에도 있지만) Attentive Transformer가 눈에 들어온다. 
구글에서 만든 BERT 모형의 &lt;Attention is all you need&gt; 논문에서 많이 본 단어였다. 
Transformer를 연구하면서 파생된 것 같다..! </p>
<p>자세한 설명은 <a href="https://wsshin.tistory.com/5">여기 블로그</a>에서 정말 쉽게 설명해주셨다. </p>
<h2 id="baseline---tabnet">Baseline - TabNet</h2>
<h3 id="1st-try">1st try</h3>
<p>(기본적인) 피쳐엔지니어링 해준 데이터셋을 가지고 먼저 돌려보았다. 총 1275개 피쳐 그리고 파라미터는 <a href="https://www.kaggle.com/code/hinepo/amex-tabnet-training">TabNet-training</a> 코드에서 그대로 가져와서 사용했다. </p>
<p>처음 Pytorch pip 인스톨에서 에러가 난다면 </p>
<pre><code class="language-python">!pip install --user pytorch-tabnet</code></pre>
<p>위 명령어를 시도해보시길!</p>
<p>첫 에폭부터 <code>val_amex_score</code>가 심상치 않았다.. 
참고한 캐글 코드에서는 아래와 같이 나왔는데,
<code>epoch 0  | loss: 0.511   | val_0_auc: 0.91961 | val_0_accuracy: 0.8515  | val_0_amex_tabnet: 0.62966 |  0:00:25s</code></p>
<p>내가 돌린 코드는 
<code>epoch 0  | loss: 0.59655 | val_0_auc: 0.88705 | val_0_accuracy: 0.82154 | val_0_amex_tabnet: 0.53668 |  0:04:50s</code>
이정도의 차이가 났다. 
실행시간, 스코어, train loss 도 좋지 않았지만, 일단 조금 더 지켜보기로 했다. </p>
<p>참고한 코드에서는 60 epoch 까지가면 0.795까진 나오는것 같은데 피쳐엔지니어를 추가한 게 오히려 성능 저하시키는 느낌이었다. </p>
<h3 id="2nd-try">2nd try</h3>
<p>참고한 캐글 코드에서는 아래 리스트 것들만 전처리를 해주었다. </p>
<ol>
<li>Average, Max, Min, Last (컬럼 골라서)</li>
<li>One Hot Encoding (범주형 변수)</li>
<li>fillna(0)</li>
</ol>
<p>-&gt; 435 features</p>
<p>따라서 나도 아주아주 기본적인 FE만 해주기로 했다. </p>
<ol>
<li>Mean, Std, Last (모든 수치형 컬럼)</li>
<li>last (범주형 변수)</li>
<li>inf, fillna(-999)</li>
</ol>
<p>-&gt; 719 features
이렇게 줄였는데도,, 
<code>epoch 0  | loss: 0.59619 | val_0_auc: 0.86788 | val_0_accuracy: 0.78992 | val_0_amex_tabnet: 0.50974 |  0:02:56s</code> 
더 안좋아지는 것 같다는 느낌에, 일단 아예 같은 피쳐를 넣어서 보기로 했다.</p>
<h3 id="3rd-try">3rd try</h3>
<hr>
<h3 id="reference">Reference</h3>
<ul>
<li><a href="https://housekdk.gitbook.io/ml/ml/tabular/tabnet-overview">TabNet, Overview</a></li>
<li><a href="https://wsshin.tistory.com/5">[논문 리뷰 및 코드구현] TABNET</a></li>
<li><a href="https://huidea.tistory.com/292">[Deep learning][논문리뷰] Tabnet : Attentive Interpretable Tabular Learning</a></li>
<li><a href="https://www.kaggle.com/code/hinepo/amex-tabnet-training">Kaggle Code - AMEX-TabNet training</a></li>
<li><a href="https://www.kaggle.com/code/medali1992/amex-tabnetclassifier-feature-eng-0-791">Kaggle Code - AMEX TabNetClassifier + Feature Eng [0.791]</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[KAX Ep.2] 레퍼런스 코드들 - Kaggle AMEX]]></title>
            <link>https://velog.io/@leo_kim/KAX-baseline-reference</link>
            <guid>https://velog.io/@leo_kim/KAX-baseline-reference</guid>
            <pubDate>Thu, 14 Jul 2022 12:39:57 GMT</pubDate>
            <description><![CDATA[<p>2022년 7월 15일 기준으로 Kaggle AMEX(캐글 아멕스) 대회에 2,767 팀이 참여하고 있다. 
코드를 처음부터 빌드해가는 방법도 있겠지만, 오픈소스가 많고 다들 공유하는 분위기라... baseline은 많이 참고하는 듯 하다. 
우리팀이 참고했던 코드를 이해해보고 잘 활용해보자.</p>
<h2 id="data-preprocessing">Data Preprocessing</h2>
<p>먼저 전처리하는 코드이다. 주최측에서 제공한 파일은 csv 포맷에 총 크기가 50.31GB 이라서 다루기가 쉽지 않다. 다른 아티클을 참고하여 <code>.parquet</code>, <code>.pickle</code>, <code>.feather</code> 등의 포맷을 사용한다고 알게되었다.</p>
<ul>
<li>Radder - <a href="https://www.kaggle.com/code/raddar/amex-data-int-types-train">amex data int types - train</a>
다른 코드들에서 많이 가져다쓰는 데이터셋이길래 일단 적용해보았다.<ul>
<li>랜덤 노이즈 제거 <code>floorify</code></li>
<li>category 컬럼 라벨인코딩</li>
<li>dtype 변경</li>
</ul>
</li>
</ul>
<p>최종적으로 <code>.parquet</code> 포맷으로 변경되어 사용할 수 있다. <a href="https://www.kaggle.com/datasets/raddar/amex-data-integer-dtypes-parquet-format">데이터 파일</a></p>
<h2 id="baseline-model">Baseline Model</h2>
<h3 id="lightgbm-quick-start---by-ambrosm">LightGBM Quick start - by Ambrosm</h3>
<p><a href="https://www.kaggle.com/code/ambrosm/amex-lightgbm-quickstart/notebook">Code Here</a>
가장 먼저 참고한 베이스라인 모델코드였다. 
LGBM은 가볍지만 좋은 성능으로 쉽게 돌려보는 용도로 많이 쓰인다. User defined Function (UDF)를 제외하고 코드를 조금 이해해보자면 아래와 같은 순서로 되어있다. </p>
<ol>
<li>Feature Engineering </li>
</ol>
<ul>
<li>Customer_id 당 data point로 이뤄진 df로 변환</li>
<li>이 과정에서 Customer_id 당 <code>mean</code>, <code>min</code>, <code>max</code>, <code>last</code> 값을 계산하게 된다. </li>
<li>최종 shape: (924621, 469) - <em>Train set</em></li>
</ul>
<ol start="2">
<li>Model Training</li>
</ol>
<ul>
<li><strong>Stratified K-Fold</strong> (5 folds) : default 데이터이다 보니까 0,1 의 binary 값을 가지게 된다. 따라서 fold 마다 1 [default] 값이 골고루 들어가도록 하기 위해서 stratified k-fold를 사용한다.</li>
<li><strong>Parameters</strong> 모델의 하이퍼파라미터를 설정해준다. 따로 튜닝은 해주지 않은 듯하다. <del>(언급이 있었는데 제가 못찾은 것일지도)</del></li>
</ul>
<ol start="3">
<li>Prediction
학습한 모델에 test 데이터를 집어 넣고 prediction 값을 리턴한다. </li>
</ol>
<table>
<thead>
<tr>
<th></th>
<th align="center">fold0</th>
<th align="center">fold1</th>
<th align="center">fold2</th>
<th align="center">fold3</th>
<th align="center">fold4</th>
<th align="center">OOF</th>
</tr>
</thead>
<tbody><tr>
<td>Result</td>
<td align="center">0.79374</td>
<td align="center">0.79152</td>
<td align="center">0.79357</td>
<td align="center">0.79545</td>
<td align="center">0.79488</td>
<td align="center">0.79383</td>
</tr>
<tr>
<td>위 표와 같은 결과를 얻을 수 있다.</td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
</tr>
<tr>
<td>캐글 사이트에서 제출했을 때 0.793 점수가 나왔었다.</td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
</tr>
<tr>
<td>OOF 결과와 비슷하게 나온 것 같다.</td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
</tr>
</tbody></table>
<blockquote>
<p><strong>개선해볼점</strong></p>
<ol>
<li>다른 피쳐를 추가해보자: std, first 값 등</li>
<li>파라미터 튜닝 (아직은 하지 않았다. 거의 최종단계에서 돌려보자)</li>
<li>NA 값 채우기</li>
<li>처리해준 피쳐가 전부 같은 처리를 한 것이 아니라 선택적으로 처리를 해줬는데, 이에 대한 래셔널이 맞는지 확인해볼 필요가 있다. </li>
</ol>
</blockquote>
<hr>
<h3 id="keras-neural-network---by-ambrosm">Keras Neural Network - by Ambrosm</h3>
<p><a href="https://www.kaggle.com/code/ambrosm/amex-keras-quickstart-1-training">Code Here</a>
간단한 뉴럴넷 모델로 돌려보려고 참고한 코드이다.
통상적으로 tabular 데이터에는 뉴럴넷보다는 머신러닝 알고리즘(lgbm, xgb, rf)이 성능이 더 좋다고 알려져있지만 다른 모델도 적용해보고자 참고하였다.</p>
<ol>
<li>Feature Engineering</li>
</ol>
<ul>
<li>위에서 언급한 lgbm과 동일한 사람이 작성한 코드이기 때문에 해준 처리는 동일하다.</li>
</ul>
<ol start="2">
<li>Model Training</li>
</ol>
<ul>
<li>다른점만 언급하자면 모델만 다르다. 4개의 hidden layer, skip connection, dropout을 포함한 아래와 같은 모델을 선택했다. <img src="https://velog.velcdn.com/images/leo_kim/post/0e8071e1-32ff-49ae-8f43-7cfdbf3d2f0f/image.png" alt=""></li>
<li>lgbm과 마찬가지로 stratified K-fold를 적용했는데, 폴드 수만 10으로 증가시켰다. 이 부분은 저자에게 discussion 탭을 통해 물어보니 10 fold로 바꿔서 LB 스코어가 증가될 것을 기대했다고 한다.
<img src="https://velog.velcdn.com/images/leo_kim/post/ec9015eb-43fa-47d7-ba36-11f43ce2bc07/image.png" alt=""></li>
<li>무작정 폴드 수를 늘리는 것이 스코어를 늘린다는 보장은 없으나, 달리 해보는 것은 의미가 있을 듯하다.</li>
</ul>
<ol start="3">
<li>Prediction
예측하는 부분 코드도 크게 달라진점은 없었다. </li>
</ol>
<table>
<thead>
<tr>
<th></th>
<th align="center">fold0</th>
<th align="center">fold1</th>
<th align="center">fold2</th>
<th align="center">fold3</th>
<th align="center">fold4</th>
<th align="center"></th>
</tr>
</thead>
<tbody><tr>
<td>Result</td>
<td align="center">0.79485</td>
<td align="center">0.78556</td>
<td align="center">0.78797</td>
<td align="center">0.79310</td>
<td align="center">0.78511</td>
<td align="center"></td>
</tr>
<tr>
<td></td>
<td align="center">fold5</td>
<td align="center">fold6</td>
<td align="center">fold7</td>
<td align="center">fold8</td>
<td align="center">fold9</td>
<td align="center">OOF</td>
</tr>
<tr>
<td>Result</td>
<td align="center">0.79027</td>
<td align="center">0.79326</td>
<td align="center">0.79456</td>
<td align="center">0.79074</td>
<td align="center">0.78690</td>
<td align="center">0.79023</td>
</tr>
</tbody></table>
<p>OOF 점수가 0.79023 이 나왔고
실제 제출결과는 0.790 으로 거의 동일하게 나왔다. </p>
<blockquote>
<p><strong>개선해볼점</strong></p>
<ol>
<li>마찬가지로 Feature 추가</li>
<li>모델의 변경 - feature를 추가함에 따른 모델의 노드 개수 변경 &amp; 히든레이어나 구조자체를 바꿀 수 있겠다.</li>
</ol>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[KAX Ep.1] Kaggle에 도전하기로 했다.]]></title>
            <link>https://velog.io/@leo_kim/Kaggle-%EC%97%90-%EB%8F%84%EC%A0%84%ED%95%98%EA%B8%B0%EB%A1%9C-%ED%96%88%EB%8B%A4</link>
            <guid>https://velog.io/@leo_kim/Kaggle-%EC%97%90-%EB%8F%84%EC%A0%84%ED%95%98%EA%B8%B0%EB%A1%9C-%ED%96%88%EB%8B%A4</guid>
            <pubDate>Mon, 11 Jul 2022 05:46:17 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/leo_kim/post/ac17ae11-c018-4e6f-b6ea-e2b6a13e3eeb/image.jpg" alt=""></p>
<h2 id="2022년-7월-4일-캐글에-참여하기로-했다">2022년 7월 4일 캐글에 참여하기로 했다.</h2>
<p>고민을 시작한 것은 6월 27일 부터였고, 대회 선정에 2~3일 정도 걸렸다. 최종적으로 선택한 대회는 AMEX의 monthly customer profile 데이터로 각 고객의 default probabilty를 예측하는 것.</p>
<h3 id="선정이유">선정이유</h3>
<ul>
<li>관심있는 금융 도메인의 대회</li>
<li>많은 참여자 + 활발한 reference code 공유</li>
<li>적당히 큰 데이터셋</li>
<li>Tabular 데이터셋</li>
<li><del>다른 선택지가 그리 많지 않았다..</del></li>
</ul>
<h3 id="dataset">DataSet</h3>
<ul>
<li><code>train</code> : 384 cols, 458,913 rows (16.4GB)</li>
<li><code>test</code> : 384 cols, 924,621 rows (33.82GB)</li>
</ul>
<h3 id="team">Team</h3>
<p><img src="https://velog.velcdn.com/images/leo_kim/post/814bbafa-42a5-4238-8719-c9114a8f69a5/image.png" alt="Team intro" title="트레인셋과 테스트셋의 만남 ^^;"> 트레인셋과 테스트셋의 만남 ^^;
2인 팀으로 참여하고 있다. 
팀명은 GossariMuchim. K-캐글의 힘을 보여주겠다.</p>
<h3 id="goal">Goal</h3>
<p>이 대회의 1등 상금이 40,000$ 인데, 우리의 목표는 1등!</p>
<h3 id="timeline">Timeline</h3>
<ul>
<li>May 25, 2022 - Start Date</li>
<li>August 24, 2022 - Final Submission Deadline</li>
</ul>
<p>앞으로 한 달 조금 더 남았는데, 현재는 EDA를 1차적으  마치고 baseline + FE 몇 가지를 실험해보고 있다. </p>
<blockquote>
<p>종종 상황을 업데이트 올리겠다. Good Luck 🍀</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[KoGPT 써보기]]></title>
            <link>https://velog.io/@leo_kim/KoGPT</link>
            <guid>https://velog.io/@leo_kim/KoGPT</guid>
            <pubDate>Wed, 29 Jun 2022 13:36:00 GMT</pubDate>
            <description><![CDATA[<p>KoGPT는 2021년 카카오브레인에서 발표한 GPT-3 한국어 버젼이다. 
언어모델을 써야하는 일이 있어 써보기로 했다.</p>
<p>... 근데 어떻게 쓰는거지?</p>
<p>코드를 일단 돌려보고 고민해보자.</p>
<p>코드는 카카오브레인 Github, Huggingface에서 가져왔다.
<a href="https://huggingface.co/kakaobrain/kogpt">https://huggingface.co/kakaobrain/kogpt</a></p>
<pre><code class="language-python">import torch
from transformers import AutoTokenizer, AutoModelForCausalLM 

tokenizer = AutoTokenizer.from_pretrained(
  &#39;kakaobrain/kogpt&#39;, revision=&#39;KoGPT6B-ryan1.5b-float16&#39;,  # or float32 version: revision=KoGPT6B-ryan1.5b
  bos_token=&#39;[BOS]&#39;, eos_token=&#39;[EOS]&#39;, unk_token=&#39;[UNK]&#39;, pad_token=&#39;[PAD]&#39;, mask_token=&#39;[MASK]&#39;
)
model = AutoModelForCausalLM.from_pretrained(
  &#39;kakaobrain/kogpt&#39;, revision=&#39;KoGPT6B-ryan1.5b-float16&#39;,  # or float32 version: revision=KoGPT6B-ryan1.5b
  pad_token_id=tokenizer.eos_token_id,
  torch_dtype=&#39;auto&#39;, low_cpu_mem_usage=True
).to(device=&#39;cuda&#39;, non_blocking=True)
_ = model.eval()

prompt = &#39;인공지능아, 너는 말을 할 수 있니?&#39;
with torch.no_grad():
  tokens = tokenizer.encode(prompt, return_tensors=&#39;pt&#39;).to(device=&#39;cuda&#39;, non_blocking=True)
  gen_tokens = model.generate(tokens, do_sample=True, temperature=0.8, max_length=64)
  generated = tokenizer.batch_decode(gen_tokens)[0]

print(generated)</code></pre>
<h2 id="첫번째-오류">첫번째 오류.</h2>
<p>위 코드를 돌리니 가장 처음 뜨는 오류는,</p>
<pre><code>ModuleNotFoundError: No module named &#39;torch&#39;</code></pre><p>torch 가 없대,,,ㅎㅎ</p>
<p>가상환경에서 pytorch를 설치하는 블로그를 보고 해결! 감사합니다</p>
<blockquote>
<p><a href="https://eunji7267.tistory.com/6">https://eunji7267.tistory.com/6</a></p>
</blockquote>
<h2 id="두번째-오류">두번째 오류.</h2>
<pre><code>ModuleNotFoundError: No module named &#39;transformers&#39;</code></pre><p>첫 번째 오류가 해결되니, 기다렸다는듯이 다른 오류!
-&gt; 두 번째 오류는 anaconda prompt 에서 </p>
<pre><code>conda install transformers</code></pre><p>로 해결~</p>
<p><img src="https://velog.velcdn.com/images/leo_kim/post/5122ba93-4f3e-4f92-9548-2245d2f048d2/image.png" alt=""></p>
<p>몇 분의 다운로딩 과정을 기다리면 된다.
어김없이 에러인데, Runtime Error</p>
<p>개인 pc에서는 안될것 같다.
연구실 pc에서 해보자!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[K-means Clustering]]></title>
            <link>https://velog.io/@leo_kim/K-means-Clustering</link>
            <guid>https://velog.io/@leo_kim/K-means-Clustering</guid>
            <pubDate>Fri, 24 Jun 2022 07:26:35 GMT</pubDate>
            <description><![CDATA[<p>k-means Clustering 할 때
여러번 돌리고 난 후 제일 좋은 결과 하나를 뽑는다고 할 때.
&quot;제일 좋은 결과&quot;란 무엇인가?</p>
<ul>
<li>분류한 결과를 앙상블 한다. (majority voting)</li>
<li>군집 내 거리는 짧고, 군집 간 거리는 크게 분류된 결과를 취한다.</li>
<li>k-means silhouette
  실루엣 스코어가 높을 때 좋다!</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Clustering Post-processing]]></title>
            <link>https://velog.io/@leo_kim/Clustering-Post-processing</link>
            <guid>https://velog.io/@leo_kim/Clustering-Post-processing</guid>
            <pubDate>Fri, 24 Jun 2022 06:44:29 GMT</pubDate>
            <description><![CDATA[<p>정답은 없다!</p>
<p>비즈니스 맥락을 파악하면서 내가 클러스터링하는 게 맞는지 계속 검증하는 것이 필요</p>
]]></description>
        </item>
    </channel>
</rss>