<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>butter_shower</title>
    <link>https://butter-shower.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Thu, 21 May 2026 07:55:45 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>_rian</managingEditor>
    <image>
      <title>butter_shower</title>
      <url>https://t1.daumcdn.net/cfile/tistory/990826385BEF7E6412</url>
      <link>https://butter-shower.tistory.com</link>
    </image>
    <item>
      <title>Jenkins Agent 연결의 종류 및 JNLP 끊김 해결 (JNLP -&amp;gt; WebSocket 연결로 전환)</title>
      <link>https://butter-shower.tistory.com/266</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;824&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cah2Zt/btsFiOF8NJz/JSt70YpxsW1d3AE6U1e0Sk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cah2Zt/btsFiOF8NJz/JSt70YpxsW1d3AE6U1e0Sk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cah2Zt/btsFiOF8NJz/JSt70YpxsW1d3AE6U1e0Sk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcah2Zt%2FbtsFiOF8NJz%2FJSt70YpxsW1d3AE6U1e0Sk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;824&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;824&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Jenkins Agent와 Master가 연결하는데에는 크게 &lt;u&gt;&lt;b&gt;(1)JNLP 방식&lt;/b&gt;&lt;/u&gt;과 &lt;u&gt;&lt;b&gt;(2)WebSocket&lt;/b&gt;&lt;/u&gt; 방식이 있습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Jenkins의 Master - Agent 연결 방식의 종류&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;JNLP (Java Network Launch Protocol)&lt;/span&gt; &lt;/b&gt;방식
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;master와 agent가 연겨하는 데에 별도의 포트를 사용하여 master - agent 통신을 위한 독립적인 채널을 사용하는 방식&lt;/li&gt;
&lt;li&gt;Jenkins 초기 버전부터 사용되어 온 방식&lt;/li&gt;
&lt;li&gt;장점 : Jenkins에서 웹 트래픽과 Agent 통신 트래픽을 분리하여 관리할 수 있음.&lt;/li&gt;
&lt;li&gt;단점 : 방화벽 설정이나 네트워크 정책에 따라 연결 문제를 일으킬 수 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;WebSocket&lt;/span&gt; &lt;/b&gt;방식
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HTTP 연결을 업그레이드하여 양방향 통신 채널을 제공하는 방식으로, 웹 표준 기술이며 대부분의 현대 웹 브라우저와 호환됨.&lt;/li&gt;
&lt;li&gt;장점
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단일 포트 사용이 가능함. Jenkins 웹서버가 사용하는 동일한 HTTP/HTTPS 포트 (예: 8080/443)을 사용하기 때문에 별도의 포트를 열어두지 않아도 됨.&lt;/li&gt;
&lt;li&gt;websocket은 지속적인 연결을 유지하므로 연결에 따른 오버헤드가 줄어들고 네트워크 리소스 사용이 최적화 됨&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;단점 : 전통적인 JNLP방식과 달라졌기 때문에 일부 jenkins 플러그인에서 호환성 문제가 발생할 수 있음. websocket 트래픽을 특별히 관리하거나 필터링 해야하는 경우 추가적인 작업이 필요할 수 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;WebSocket 방식으로 Jenkins Agent를 추가하는 방법&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Jenkins &amp;gt; Jenkins 관리 &amp;gt; System Configuration &amp;gt; 노드관리 &amp;gt; 연결하고자 하는 agent 클릭 &amp;gt; 설정 클릭&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1126&quot; data-origin-height=&quot;1366&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oGxzn/btsFkH7CVE3/kdHGaqnbAqBNcHeX33KlwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oGxzn/btsFkH7CVE3/kdHGaqnbAqBNcHeX33KlwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oGxzn/btsFkH7CVE3/kdHGaqnbAqBNcHeX33KlwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoGxzn%2FbtsFkH7CVE3%2FkdHGaqnbAqBNcHeX33KlwK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;350&quot; height=&quot;425&quot; data-origin-width=&quot;1126&quot; data-origin-height=&quot;1366&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 아래 구성 설정 중 &quot;Use Websocket&quot; 설정 체크 표시&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1676&quot; data-origin-height=&quot;1450&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNoDhd/btsFh61ndYr/WcOeW8nChgD6fqRkrBXKX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNoDhd/btsFh61ndYr/WcOeW8nChgD6fqRkrBXKX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNoDhd/btsFh61ndYr/WcOeW8nChgD6fqRkrBXKX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNoDhd%2FbtsFh61ndYr%2FWcOeW8nChgD6fqRkrBXKX0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;433&quot; data-origin-width=&quot;1676&quot; data-origin-height=&quot;1450&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 연결되어 있지 않으면 아래와 같이 나오는데, 여기서 agent.jar 를 클릭하여 다운로드&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1368&quot; data-origin-height=&quot;540&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKZ2Ek/btsFmkjIMQo/X4sInIT87quPpf05AV4KB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKZ2Ek/btsFmkjIMQo/X4sInIT87quPpf05AV4KB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKZ2Ek/btsFmkjIMQo/X4sInIT87quPpf05AV4KB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKZ2Ek%2FbtsFmkjIMQo%2FX4sInIT87quPpf05AV4KB0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1368&quot; height=&quot;540&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1368&quot; data-origin-height=&quot;540&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 다운로드 한 agent.jar 파일을 Jenkins Agent 서버로 옮김&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Jenkins Agent가 실행되는 위치에 agent.jar 파일 위치시킴&lt;/li&gt;
&lt;li&gt;아래와 같이 shell script 작성&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1164&quot; data-origin-height=&quot;204&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/N6jUC/btsFhnhZpx1/iZI7T1bkh97ZkzTU6lEmW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/N6jUC/btsFhnhZpx1/iZI7T1bkh97ZkzTU6lEmW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/N6jUC/btsFhnhZpx1/iZI7T1bkh97ZkzTU6lEmW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FN6jUC%2FbtsFhnhZpx1%2FiZI7T1bkh97ZkzTU6lEmW0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1164&quot; height=&quot;204&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1164&quot; data-origin-height=&quot;204&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;쉘 스크립트 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 연결 완료 및 연결 확인&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2748&quot; data-origin-height=&quot;1326&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RhVo0/btsFjXJDANN/G6blSYfiH2zjQvtrg4BCjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RhVo0/btsFjXJDANN/G6blSYfiH2zjQvtrg4BCjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RhVo0/btsFjXJDANN/G6blSYfiH2zjQvtrg4BCjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRhVo0%2FbtsFjXJDANN%2FG6blSYfiH2zjQvtrg4BCjK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;241&quot; data-origin-width=&quot;2748&quot; data-origin-height=&quot;1326&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Error Note  </category>
      <author>_rian</author>
      <guid isPermaLink="true">https://butter-shower.tistory.com/266</guid>
      <comments>https://butter-shower.tistory.com/266#entry266comment</comments>
      <pubDate>Tue, 27 Feb 2024 13:10:21 +0900</pubDate>
    </item>
    <item>
      <title>파이썬에서 백업 파일 및 임시 파일 생성하는 방법</title>
      <link>https://butter-shower.tistory.com/265</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/G6K9w/btsE6T8iVTd/DPwzssheX1AdA9VIb7zbnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/G6K9w/btsE6T8iVTd/DPwzssheX1AdA9VIb7zbnk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/G6K9w/btsE6T8iVTd/DPwzssheX1AdA9VIb7zbnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FG6K9w%2FbtsE6T8iVTd%2FDPwzssheX1AdA9VIb7zbnk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;400&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;500&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;가끔가다가 파일을 읽고 저장하는 과정에서 오류가 발생할 시 파일이 손상되어 더이상 사용할 수 없게 되는 경우들이 발생할 수 있다.&lt;br&gt;이를 위해 기존 파일에 대한 백업파일을 생성하고, 임시 파일에서 write 작업을 한뒤 기존 파일로 교체해주는 작업을 해줄 수 있다.&lt;/p&gt;
&lt;h2&gt;1. 백업 파일 생성하는 방법&lt;/h2&gt;
&lt;p&gt;파이썬의  &lt;code&gt;shutil&lt;/code&gt; 라이브러리 내 &lt;code&gt;.copy&lt;/code&gt; 함수를 이용하여 백업 파일을 생성하면 된다. &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import shutil

path = &amp;#39;/path/to/data.pkl&amp;#39;

# 임시 및 백업 경로 설정
temp_path = path + &amp;#39;.temp&amp;#39;
backup_path = path + &amp;#39;.backup&amp;#39;

# 백업 파일 생성
shutil.copy(path, backup_path)&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;2. 임시 파일 생성 후 기존 파일로 교체하는 방법&lt;/h2&gt;
&lt;p&gt;임시파일로 변경된 저장 결과를 저장하고 이를 기존 파일로 교체하기 위해선 &lt;code&gt;os.replace()&lt;/code&gt; 를 사용하면 된다. &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import os
import pickle

data = {} # ...

# 임시 파일로 저장
with open(temp_path, &amp;quot;wb&amp;quot;) as file:
    pickle.dump(data, file)

# 임시 파일을 원본 파일로 교체
os.replace(temp_path, path)&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;3. 오류 발생 시 원본 파일을 백업에서 복구&lt;/h2&gt;
&lt;p&gt;오류가 발생해 파일이 정상적으로 종료되지 않았다면 아래와 같이 백업된 파일 경로에서 불러오면 된다. &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# backup된 파일을 기존 파일로 복구
shutil.copy(backup_path, path)&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;4. 임시 파일 or 백업 파일 정리하기 (삭제하기)&lt;/h2&gt;
&lt;p&gt;백업된 파일과 임시 파일을 제거하고 싶다면 &lt;code&gt;os.remove()&lt;/code&gt; 를 사용하면 된다. &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;if os.path.exists(temp_path):
    os.remove(temp_path)
if os.path.exists(backup_path):
    os.remove(backup_path)&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Computer Engineering/Python</category>
      <author>_rian</author>
      <guid isPermaLink="true">https://butter-shower.tistory.com/265</guid>
      <comments>https://butter-shower.tistory.com/265#entry265comment</comments>
      <pubDate>Tue, 20 Feb 2024 14:55:45 +0900</pubDate>
    </item>
    <item>
      <title>Ray와 Ray를 이용한 ML모델 학습 예시</title>
      <link>https://butter-shower.tistory.com/264</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1400&quot; data-origin-height=&quot;701&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BxPqm/btsETTfAzYu/AEVzmJyFabML6ecabloEqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BxPqm/btsETTfAzYu/AEVzmJyFabML6ecabloEqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BxPqm/btsETTfAzYu/AEVzmJyFabML6ecabloEqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBxPqm%2FbtsETTfAzYu%2FAEVzmJyFabML6ecabloEqK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1400&quot; height=&quot;701&quot; data-origin-width=&quot;1400&quot; data-origin-height=&quot;701&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.ray.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.ray.io/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1707926269839&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Productionizing and scaling Python ML workloads simply | Ray&quot; data-og-description=&quot;Scale your compute-intensive Python workloads. From reinforcement learning to large-scale model serving, Ray makes the power of distributed compute easy and accessible to every engineer.&quot; data-og-host=&quot;www.ray.io&quot; data-og-source-url=&quot;https://www.ray.io/&quot; data-og-url=&quot;https://www.ray.io/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/N0mVh/hyVi8V7lsF/MWRi1IUDRMG8UxKyZOgvU1/img.png?width=2954&amp;amp;height=1478&amp;amp;face=0_0_2954_1478,https://scrap.kakaocdn.net/dn/CZipl/hyVjji1bBX/TUHBG1UZupyFXBakvEKIMk/img.png?width=2954&amp;amp;height=1478&amp;amp;face=0_0_2954_1478,https://scrap.kakaocdn.net/dn/TMK8N/hyVjdXpBUh/02e227YkLoigMuXilyqbfk/img.png?width=1920&amp;amp;height=576&amp;amp;face=0_0_1920_576&quot;&gt;&lt;a href=&quot;https://www.ray.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.ray.io/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/N0mVh/hyVi8V7lsF/MWRi1IUDRMG8UxKyZOgvU1/img.png?width=2954&amp;amp;height=1478&amp;amp;face=0_0_2954_1478,https://scrap.kakaocdn.net/dn/CZipl/hyVjji1bBX/TUHBG1UZupyFXBakvEKIMk/img.png?width=2954&amp;amp;height=1478&amp;amp;face=0_0_2954_1478,https://scrap.kakaocdn.net/dn/TMK8N/hyVjdXpBUh/02e227YkLoigMuXilyqbfk/img.png?width=1920&amp;amp;height=576&amp;amp;face=0_0_1920_576');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Productionizing and scaling Python ML workloads simply | Ray&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Scale your compute-intensive Python workloads. From reinforcement learning to large-scale model serving, Ray makes the power of distributed compute easy and accessible to every engineer.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.ray.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Ray란?&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;오픈소스 분산 컴퓨팅 프레임워크. Python 기반으로 간단하면서도 강력한 API를 제공하고 있다. (한마디로, 편하다!)&lt;/li&gt;
&lt;li&gt;기계학습, 강화학습 등의 컴퓨팅 작업도 수월하게 처리 가능함.&lt;/li&gt;
&lt;li&gt;핵심 기능
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;간편한 병렬화&lt;/b&gt; : Python 함수를 쉽게 병렬 작업으로 전환 가능&lt;/li&gt;
&lt;li&gt;&lt;b&gt;분산 객체 저장소&lt;/b&gt; : 대규모 데이터 세트를 여러 노드에 걸쳐 효율적으로 공유&lt;/li&gt;
&lt;li&gt;&lt;b&gt;확장성&lt;/b&gt; : 단일 노드에서 작업을 시작하여 클러스터로 쉽게 확장&lt;/li&gt;
&lt;li&gt;&lt;b&gt;결함 허용&lt;/b&gt; : 시스템 일부가 실패해도 작업이 계속됨&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Ray의 구성 요소&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Task (Remote Function)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;분산처리를 실행하는 &quot;함수&quot;&lt;/li&gt;
&lt;li&gt;함수를 &lt;code&gt;@ray.remote&lt;/code&gt;로 감싸며 어노테이션을 해준다.&lt;/li&gt;
&lt;li&gt;해당 함수를 호출하게 될 경우 task가 &lt;b&gt;비동기(asynchoronously)&lt;/b&gt;하게 실행됨 (동기식이 아님)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;task_func.remote()&lt;/code&gt; 를 호출하면 Future 객체로 반환되며, &lt;code&gt;ray.get(future)&lt;/code&gt;를 할 경우 task가 실행됨&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Actor&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;@ray.remote&lt;/code&gt; 로 감싼 함수가 호출된 이후 파이썬 &lt;b&gt;클래스의 인스턴스&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Driver&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로그램이 돌아가는 메인 root 환경 (spark에서 driver와 비슷한 개념)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ray.init()&lt;/code&gt; 을 호출하면 실행됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;그 외 Object, Job 등이 있지만 이정도만 알아도 개발을 하는 단계에서는 충분하다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Ray를 활용한 예시 코드&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;haskell&quot;&gt;&lt;code&gt;# 라이브러리 import
import ray

# 강화학습 예시 - 사전 정의한 agent, env 코드 및 함수
from dqn_agent import DQNAgent
from dqn_env import DQNEnv
from dqn_func import train_dqn, save_model

# Ray 초기화
ray.init()

# DQN 학습을 위한 Ray 원격 함수 정의
@ray.remote
def train_and_save_model(ctlg_no, data, state_size, n_action, model_id):
    agent = DQNAgent(state_size, n_action)
    env = DQNEnv(data)

    train_dqn(agent, env)
    save_model(agent, env, ctlg_no)

    return agent, env

# 데이터 준비
data_list = [prepare_data(i) for i in range(1000)]

# 각 학습을 병렬로 실행
futures = [train_and_save_model.remote(ctlg_no, data, state_size, n_action, i) for i, data in enumerate(data_list)]

# 모든 작업이 완료될때까지 기다림
result_agent, result_env = ray.get(futures)

# Ray 종료
ray.shutdown()&lt;/code&gt;&lt;/pre&gt;</description>
      <category>머신러닝 꿈나무</category>
      <author>_rian</author>
      <guid isPermaLink="true">https://butter-shower.tistory.com/264</guid>
      <comments>https://butter-shower.tistory.com/264#entry264comment</comments>
      <pubDate>Thu, 15 Feb 2024 00:55:50 +0900</pubDate>
    </item>
    <item>
      <title>Anaconda Conda 가상환경에서 pip로 패키지 설치하기</title>
      <link>https://butter-shower.tistory.com/263</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tfFu3/btsEQcgDgZ7/SxK2h7UHKdba7mXppkbbLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tfFu3/btsEQcgDgZ7/SxK2h7UHKdba7mXppkbbLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tfFu3/btsEQcgDgZ7/SxK2h7UHKdba7mXppkbbLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtfFu3%2FbtsEQcgDgZ7%2FSxK2h7UHKdba7mXppkbbLk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;500&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;500&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;conda 가상환경 생성 및 활성화 후에도 pip로 설치하면 제대로 설치가 되지 않는 경우가 있을 수 있습니다. 그럴때는 먼저 `which pip`를 해서 현재 pip의 경로가 어디로 설정되어있는지 한번 확인해주세요. 그렇지 않다면 절대경로를 입력해서 설치하는 방법이 있습니다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;conda 가상환경 활성화&lt;ol&gt;
&lt;li&gt;&lt;code&gt;conda activate [가상환경명]&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;conda 가상환경에 pip설치하기&lt;ol&gt;
&lt;li&gt;&lt;code&gt;conda install pip&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;conda 가상환경의 절대경로에 pip로 설치하기&lt;ol&gt;
&lt;li&gt;(예시 : 경로는 다를 수 있습니다) &lt;code&gt;~/.conda/envs/[가상환경명]/bin/pip install [패키지명]&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>Error Note  </category>
      <author>_rian</author>
      <guid isPermaLink="true">https://butter-shower.tistory.com/263</guid>
      <comments>https://butter-shower.tistory.com/263#entry263comment</comments>
      <pubDate>Thu, 15 Feb 2024 00:42:31 +0900</pubDate>
    </item>
    <item>
      <title>[혼공머신] 혼자 공부하는 머신러닝 &amp;amp; 딥러닝 5주차</title>
      <link>https://butter-shower.tistory.com/262</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;562&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXM5Jf/btsEkC1xfJ5/eSBntkfKXpWr4ef2w6JT80/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXM5Jf/btsEkC1xfJ5/eSBntkfKXpWr4ef2w6JT80/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXM5Jf/btsEkC1xfJ5/eSBntkfKXpWr4ef2w6JT80/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXM5Jf%2FbtsEkC1xfJ5%2FeSBntkfKXpWr4ef2w6JT80%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;562&quot; height=&quot;768&quot; data-origin-width=&quot;562&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Chapter 6. 비지도학습&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6-1. 군집 알고리즘&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;비지도학습 (unsupervised learning)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;타깃 (label)이 없을때 사용하는 알고리즘.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;군집화 (clustering)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;비슷한 샘플끼리 그룹으로 모으는 작업&lt;/li&gt;
&lt;li&gt;클러스터 (clusert) : 군집 알고리즘으로 만든 그룹&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6-2. k-평균&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;k-평균 (k-means) : 평균값을 자동으로 찾아주는 대표적인 군집 알고리즘
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;평균값이 클러스터의 중심에 위치하기 때문에 클러스터 중심 (cluser cener) 또는 센트로이드 (centroid) 라고 불림.&lt;/li&gt;
&lt;li&gt;알고리즘 동작 방법
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1. 무작위로 k개의 클러스터 중심을 정함&lt;/li&gt;
&lt;li&gt;2. 각 샘플에서 가장 가까운 클러스터 중심을 찾아 해당 클러스터의 샘플로 지정&lt;/li&gt;
&lt;li&gt;3. 클러스터에 속한 샘플의 평균 값으로 클러스터의 중심을 정함&lt;/li&gt;
&lt;li&gt;4. 클러스터 중심에 변화가 없을 때 까지 2번으로 돌아가 반복&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;최적의 k 찾기
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;엘보우 (elbow) 방법
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이너셔 (inertia) : 클러스터 중심과 샘플 사이의 거리 제곱 합.&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클러스터에 속한 샘플이 얼마나 가깝게 모여있는지 나타내는 값. 일반적으로 클러스터 갯수가 늘어나면 클러스터 개개의 크기는 줄어들기 때문에 이너셔도 줄어든다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;클러스터 개수에 따라 이너셔 감소가 꺾이는 지점이 적절한 k 가 될 수 있다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;KMeans 클래스에서는 자동으로 이너셔를 계산해서 `inertia_` 속성으로 제공함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6-3. 주성분 분석&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;차원 축소 (dimensionality reduction)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;대표적인 비지도학습 작업 중 하나.&lt;/li&gt;
&lt;li&gt;데이터를 잘 나타내는 일부 특성을 선택해서 데이터의 크기를 줄이고 지도 학습 모델의 성능을 향상시킬 수 있는 방법&lt;/li&gt;
&lt;li&gt;대표적인 알고리즘으로 주성분 분석 (principal component alaysis)가 있다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;주성분 분석&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터에 있는 분산이 큰 방향을 찾는 방법.&lt;/li&gt;
&lt;li&gt;설명된 분산 (explained variance) : 주성분이 얼마나 원본 데이터의 분산을 잘 나타내는기 기록한 값
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;PCA 클래스의 `explained_variance_ratio_` 에 각 주성분의 설명된 분산 비율이 기록되어 있따.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;미션&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기본 미션: k-평균 알고리즘 작동 방식 설명하기&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: left;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1. 무작위로 k개의 클러스터 중심을 정함&lt;/li&gt;
&lt;li&gt;2. 각 샘플에서 가장 가까운 클러스터 중심을 찾아 해당 클러스터의 샘플로 지정&lt;/li&gt;
&lt;li&gt;3. 클러스터에 속한 샘플의 평균 값으로 클러스터의 중심을 정함&lt;/li&gt;
&lt;li&gt;4. 클러스터 중심에 변화가 없을 때 까지 2번으로 돌아가 반복&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;선택&amp;nbsp;미션:&amp;nbsp;Ch.06(06-3)&amp;nbsp;확인&amp;nbsp;문제&amp;nbsp;풀고,&amp;nbsp;풀이&amp;nbsp;과정&amp;nbsp;정리하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2번 문제 : 샘플 개수가 1,000개고 특성 개수가 100개인 데이터셋이 있습니다. 이 데이터셋의 크기는 (1000, 100) 입니다. 이 데이터를 사이킷런의 PCA 클래스를 사용해 10개의 주성분을 찾아 변환했습니다. 변환된 데이터셋의 크기는 얼마일까요? -&amp;gt; (1000, 10)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2번 문제에서 설명된 분산이 가장 큰 주성분을 몇번째인가요? -&amp;gt; 첫번째 주성분. (PCA를 통해 얻은 주성분은 무조건 첫번째 주성분이 가장 분산이 크다.)&lt;/p&gt;</description>
      <category>머신러닝 꿈나무</category>
      <author>_rian</author>
      <guid isPermaLink="true">https://butter-shower.tistory.com/262</guid>
      <comments>https://butter-shower.tistory.com/262#entry262comment</comments>
      <pubDate>Mon, 5 Feb 2024 00:54:45 +0900</pubDate>
    </item>
    <item>
      <title>[혼공머신] 혼자 공부하는 머신러닝 &amp;amp; 딥러닝 4주차</title>
      <link>https://butter-shower.tistory.com/261</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;562&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mNKlU/btsD3JZ2E3V/nkuXHH9ubINkzJrAiKjHCK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mNKlU/btsD3JZ2E3V/nkuXHH9ubINkzJrAiKjHCK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mNKlU/btsD3JZ2E3V/nkuXHH9ubINkzJrAiKjHCK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmNKlU%2FbtsD3JZ2E3V%2FnkuXHH9ubINkzJrAiKjHCK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;562&quot; height=&quot;768&quot; data-origin-width=&quot;562&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Chapter 5. 트리 알고리즘&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5-1. 결정 트리&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;결정 트리 (Decision Tree)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예/아니오에 대한 질문을 이어나가면서 정답을 찾아 학습하는 알고리즘&lt;/li&gt;
&lt;li&gt;비교적 예측 과정을 이해하기 쉽고 성능도 뛰어남.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;불순도 (Gini impurity)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;결정트리가 최적의 질문을 찾기 위한 기준&lt;/li&gt;
&lt;li&gt;$$\text{지니 불순도} = 1 - (\text{음성 클래스의 비율}^2 + \text{양성 클래스 비율}^2 )$$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;정보이득 (information gain)&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;부모 노드와 자식 노드의 불순도 차이.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;결정트리는 제한없이 성장하면 과대적합 되기가 쉬움. 따라서 가지치기를 함으로써 결정트리의 성장을 제한하는 것도 한 방법&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5-2. 교차 검증과 그리드 서치&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;검증 세트 (validation set)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모델의 과대적합을 막기 위해 테스트 세트를 사용하지 않고 측정하는 방법&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;교차 검증 (cross validation)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;검증세트를 떼어내는 과정을 여러번 반복한 후 이 점수를 평균하여 최종 검증 점수를 얻는 방법&lt;/li&gt;
&lt;li&gt;데이터의 80~90%를 훈련에 사용할 수 있게 됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;하이퍼파라미터 튜닝
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모델이 학습할 수 없어서 사용자가 지정해야만 하는 파라미터를 하이퍼파라미터라고 함.&lt;/li&gt;
&lt;li&gt;그리드 서치 (GridSearch)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하이퍼파라미터의 탐색을 자동화해주는 도구. 탐색할 매개변수를 나열하면 교차검증을 수행하여 가장 좋은 점수의 매개변수 조합을 선택함.&lt;/li&gt;
&lt;li&gt;하이퍼파라미터의 탐색과 교차검증을 한번에 수행하는 사이킷런의 클래스&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;랜덤 서치 (RandomSearch)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;탐색할 값을 직접 나열하는 것이 아니라 탐색 값을 샘플링할 수 있는 확률 분포 객체를 전달함. 지정한 횟수만큼 샘플링하여 교차 검증을 수행하기 때문에 탐색량을 조절할 수 있다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5-3. 트리의 앙상블&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정형데이터와 비정형데이터
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정형 데이터 (structured data) : 어떤 구조로 되어있다는 뜻. csv, excel 등에 저장하기가 쉬움&lt;/li&gt;
&lt;li&gt;비정형 데이터 (unstructred data) : 텍스트데이터, 사진, 음악 등이 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;앙상블 학습 (ensemble learning)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정형 데이터를 학습할 때 가장 뛰어난 성과를 내는 알고리즘. 대부분 결정트리 기반으로 만들어져 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;랜덤 포레스트 (random forest)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;결정 트리를 랜덤하게 만들어 결정 트리 (나무)의 숲을 만듦. 그리고 각 결정트리의 예측을 사용해 최종 예측을 만드는 방법.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;부트스트랩 샘플 방식을 사용
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;전체 데이터셋에서 일부만을 사용하여 계속 샘플링하는 방법. 기본적으로 부트스트랩 샘플은 훈련 세트와 크기가 같게 만든다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;엑스트라 트리 (extra tree)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;랜덤 포레스트와 비슷하게 동작.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;랜덤 포레스트와의 차이점은 부트스트랩 샘플을 사용하지 않는다는 점. 즉, 각 결정 트리를 만들 때 전체 훈련 세트를 사용함. 대신 노드 분할할 때 가장 좋은 분할을 찾는 것이 아니라 무작위로 분할함.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;그래디언트 부스팅 (gradient boosting)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;깊이가 얕은 결정 트리를 사용하여 이전 트리의 오차를 보완하는 방식으로 앙상블 하는 방식&lt;/li&gt;
&lt;li&gt;결정 트리를 연속적으로 추가하여 손실함수를 최소화 하는 방법이기 때문에 훈련 속도는 조금 느리지만 더 좋은 성능을 기대할 수 있다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;히스토그램 기반 그래디언트 부스팅&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;그래디언트 부스팅의 속도를 개선한 방법. XGBoost 모델이 가장 유명하다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;미션&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기본 미션 : 교차검증을 그림으로 설명하기&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;885&quot; data-origin-height=&quot;613&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ct3PVl/btsD1lMA0R5/ZO29pJKK56gUaeN6zS7oS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ct3PVl/btsD1lMA0R5/ZO29pJKK56gUaeN6zS7oS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ct3PVl/btsD1lMA0R5/ZO29pJKK56gUaeN6zS7oS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fct3PVl%2FbtsD1lMA0R5%2FZO29pJKK56gUaeN6zS7oS0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;885&quot; height=&quot;613&quot; data-origin-width=&quot;885&quot; data-origin-height=&quot;613&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: left;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;검증세트를 떼어내는 과정을 여러번 반복한 후 이 점수를 평균하여 최종 검증 점수를 얻는 방법&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;선택미션 : 05-3 앙상블 모델 손코딩 코랩 화면 인증하기&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2784&quot; data-origin-height=&quot;3054&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cC7U5X/btsD7oncmDc/U0KoVnVZoPFtKTXgn36yW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cC7U5X/btsD7oncmDc/U0KoVnVZoPFtKTXgn36yW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cC7U5X/btsD7oncmDc/U0KoVnVZoPFtKTXgn36yW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcC7U5X%2FbtsD7oncmDc%2FU0KoVnVZoPFtKTXgn36yW0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2784&quot; height=&quot;3054&quot; data-origin-width=&quot;2784&quot; data-origin-height=&quot;3054&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>머신러닝 꿈나무</category>
      <author>_rian</author>
      <guid isPermaLink="true">https://butter-shower.tistory.com/261</guid>
      <comments>https://butter-shower.tistory.com/261#entry261comment</comments>
      <pubDate>Mon, 29 Jan 2024 01:47:17 +0900</pubDate>
    </item>
    <item>
      <title>[혼공머신] 혼자 공부하는 머신러닝 &amp;amp; 딥러닝 3주차</title>
      <link>https://butter-shower.tistory.com/260</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;562&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bemXhy/btsDNs4ph6Q/zeQWOLY3dKkKRgwc5ErSIk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bemXhy/btsDNs4ph6Q/zeQWOLY3dKkKRgwc5ErSIk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bemXhy/btsDNs4ph6Q/zeQWOLY3dKkKRgwc5ErSIk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbemXhy%2FbtsDNs4ph6Q%2FzeQWOLY3dKkKRgwc5ErSIk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;562&quot; height=&quot;768&quot; data-origin-width=&quot;562&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2066&quot; data-origin-height=&quot;1042&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xEehw/btsDI8l2USV/Tf5TIhJhWhwR9jKIBT9WX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xEehw/btsDI8l2USV/Tf5TIhJhWhwR9jKIBT9WX0/img.png&quot; data-alt=&quot;진도가 뭔지 몰라서 예전 과제 가져오깅.. ㅎㅎ&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xEehw/btsDI8l2USV/Tf5TIhJhWhwR9jKIBT9WX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxEehw%2FbtsDI8l2USV%2FTf5TIhJhWhwR9jKIBT9WX0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2066&quot; height=&quot;1042&quot; data-origin-width=&quot;2066&quot; data-origin-height=&quot;1042&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;진도가 뭔지 몰라서 예전 과제 가져오깅.. ㅎㅎ&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Chapter 4. 다양한 분류 알고리즘&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-1. 로지스틱 회귀&amp;nbsp;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Logistic regression
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이름은 회귀지만 사실은 분류 모델. 선형 방정식을 사용한 분류 알고리즘. 선형 회귀와 달리 시그모이드 함수나 소프트맥스 함수를 사용하여 클래스의 확률을 출력할 수 있다.&amp;nbsp;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시그모이드 함수 : 선형 방정식의 출력을 0과 1 사이의 값으로 압축.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;소프트맥스 함수 : 다중 분류에서 여러 선형 방정식의 출력 결과를 정규화하여 합이 1이 되도록 만듦&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-2. 확률적 경사하강법&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;점진적 학습&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;훈련한 모델을 버리지 않고 새로운 데이터에 대해서만 조금씩 훈련하는 학습법. 대표적으로 확률적 경사하강법이 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;확률적 경사하강법이란?
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;전체 샘플을 사용하지 않고 딱 하나의 샘플을 훈련 세트에서 랜덤하게 골라 가장 가파른 길을 찾는 방법.&lt;/li&gt;
&lt;li&gt;이걸 계속 랜덤하게 반복하여 만족할만한 위치에 도달할 때 까지 내려가는 원리.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;epoch : 확률적 경사하강법에서 훈련 세트를 한번 모두 사용하는 과정. 일반적으로 수십, 수백번 이상의 에포크를 수행.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;미니배치 경사하강법
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여러개의 샘플을 사사하강법을 수행하는 방식&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;손실함수&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;머신러닝 알고리즘이 얼마나 엉터리인지 측정하는 기준&lt;/li&gt;
&lt;li&gt;로지스틱 손실함수 : 이진 분류에서 사용하는 손실함수&lt;/li&gt;
&lt;li&gt;크로스 엔트로피 손실함수 : 다중 분류에서 사용하는 손실함수&lt;/li&gt;
&lt;li&gt;평균 제곱 오차 : 회귀 문제에서 사용하는 손실함수&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;에포크와 과대/과소 적합
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;early stopping : 과대 적합이 시작되기 전에 훈련을 멈추는 것&lt;/li&gt;
&lt;li&gt;SGDClassifier의 손실함수 : 힌지손실
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주로 서포트 벡터머신 알고리즘에서 사용하는 손실함수&amp;nbsp;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;미션&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;기본미션 : 4-1 2번 문제를 풀고 풀이 과정 설명하기&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로지스틱 회귀가 이진 분류에서 확률을 출력하기 위해 사용하는 함수 : 시그모이드 함수&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;선택 미션 :&amp;nbsp;4-2 과대적합 / 과소적합 손코딩 코랩 화면 캡쳐하기&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2784&quot; data-origin-height=&quot;3054&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/duVBMG/btsDLuVIigY/u0YszPiBZKXDseOnmlvx61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/duVBMG/btsDLuVIigY/u0YszPiBZKXDseOnmlvx61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/duVBMG/btsDLuVIigY/u0YszPiBZKXDseOnmlvx61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FduVBMG%2FbtsDLuVIigY%2Fu0YszPiBZKXDseOnmlvx61%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2784&quot; height=&quot;3054&quot; data-origin-width=&quot;2784&quot; data-origin-height=&quot;3054&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>머신러닝 꿈나무</category>
      <author>_rian</author>
      <guid isPermaLink="true">https://butter-shower.tistory.com/260</guid>
      <comments>https://butter-shower.tistory.com/260#entry260comment</comments>
      <pubDate>Sun, 21 Jan 2024 23:21:24 +0900</pubDate>
    </item>
    <item>
      <title>[혼공머신] 혼자 공부하는 머신러닝 &amp;amp; 딥러닝 2주차</title>
      <link>https://butter-shower.tistory.com/259</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;562&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxQTdE/btsDuRpPI0a/INKCeESnCdY1KtwEsyDWm1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxQTdE/btsDuRpPI0a/INKCeESnCdY1KtwEsyDWm1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxQTdE/btsDuRpPI0a/INKCeESnCdY1KtwEsyDWm1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxQTdE%2FbtsDuRpPI0a%2FINKCeESnCdY1KtwEsyDWm1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;562&quot; height=&quot;768&quot; data-origin-width=&quot;562&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Chapter 3. 회귀 알고리즘과 모델 규제&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-1. k-최근접 이웃 회귀&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;K-최근접 이웃 회귀
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예측하려는 샘플에 가장 가까운 샘플 k개를 선택&amp;nbsp;&lt;/li&gt;
&lt;li&gt;분류 문제의 경우, 이 샘플들의 클래스를 확인하여 다수의 클래스를 새로운 클래스로 예측함&lt;/li&gt;
&lt;li&gt;회귀 문제의 경우, 분류 문제와 마찬가지로 예측하려는 샘플에 가장 가까운 샘플 k개를 선택하여 이를 평균매긴 값으로 선택.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;결정 계수 ($R^2$)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;회귀 모델에서 모델을 평가하는 방식&lt;/li&gt;
&lt;li&gt;$R^2 = 1 - \frac{\sum(target - pred)^2}{\sum(target - mean)^2}$&lt;/li&gt;
&lt;li&gt;각 샘플의 타깃과 예측값의 차리를 제곱하여 더한 후 타깃과 타깃의 평균의 차이를 제곱하여 더한 값으로 나눔.&lt;/li&gt;
&lt;li&gt;$R^2$는 예측이 타겟에 아주 가까워지면 1에 가까운 값이 되며, 타깃이 평균정도를 예측하는 수준이라면 0에 가까워진다. 즉, 1에 가까울수록 좋은 모델이라고 볼 수 있다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;과대적합 vs 과소 적합&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;과대적합 (overfitting) : 훈련 세트에서 점수가 굉장히 좋았는데 테스트 세트에서는 점수가 나쁜 경우&lt;/li&gt;
&lt;li&gt;과소적합 (underfitting) : 훈련세트보다 테스트세트의 점수가 더 높거나 둘 다 너무 낮은 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-2. 선형 회귀&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;K-최근접 이웃의 한계
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;새로운 샘플이 훈련 세트의 범위를 벗어나면 엉뚱한 값을 예측하게됨.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;선형회귀 (Linear Regression)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특성이 하나인 경우 어떤 직선을 학습하는 알고리즘.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;사이킷런에서 `sklearn.linear_model` 패키지 아래 `LinearRegression` 클래스로 선형회귀 알고리즘을 구현해놓았음.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;다항 회귀
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다항 문제로 해결해야하는 경우 이러한 방정식을 다항식(polynomial)이라고 부르며 다항식을 사용한 선형회귀를 다항 회귀(polynomial regression)라고 부름.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-3. 특성공학과 규제&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다중 회귀
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여러개의 특성을 사용한 선형 회귀를 다중 회귀라고 부름.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;특성공학
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기존의 특성을 이용해 새로운 특성을 뽑아내는 과정&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;변환기 (transformer)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특성을 만들거나 전처리 하기 위한 클래스로, 사이킷런에서는 이러한 클래스를 transformer라고 부른다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;과제&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기본 미션&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ch.03 (03-1) 2번 문제 출력 그래프 인증하기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2784&quot; data-origin-height=&quot;3054&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVUca7/btsDqmSdypP/QCLunMzuc2FU1feMlNxdXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVUca7/btsDqmSdypP/QCLunMzuc2FU1feMlNxdXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVUca7/btsDqmSdypP/QCLunMzuc2FU1feMlNxdXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVUca7%2FbtsDqmSdypP%2FQCLunMzuc2FU1feMlNxdXk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2784&quot; height=&quot;3054&quot; data-origin-width=&quot;2784&quot; data-origin-height=&quot;3054&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;선택 미션&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델 파라미터에 대해 설명하기&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;K-최근접 문제는 인접한 K개의 위치를 바탕으로 예측값을 구하는데, 이때 `n_neighbors`는 사용자가 지정하는 하이퍼파라미터 K를 의미한다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>머신러닝 꿈나무</category>
      <author>_rian</author>
      <guid isPermaLink="true">https://butter-shower.tistory.com/259</guid>
      <comments>https://butter-shower.tistory.com/259#entry259comment</comments>
      <pubDate>Sun, 14 Jan 2024 21:35:33 +0900</pubDate>
    </item>
    <item>
      <title>강화학습이란? 심층 강화학습에 대한 정의와 종류</title>
      <link>https://butter-shower.tistory.com/258</link>
      <description>&lt;h1&gt;강화학습이란?&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;순차적인 의사결정 문제를 해결하는 방법.&lt;/li&gt;
&lt;li&gt;실제 세계의 많은 문제는 순차적 의사 결정 문제로 표현될 수 있다.&lt;/li&gt;
&lt;li&gt;강화학습 문제는 에이전트와 환경으로 구성되는 하나의 시스템으로 표현될 수 있는데ㅡ 환경은 시스템의 상태를 나타내는 정보를 만들어낸다. 이걸 상태(state)라고 부른다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1454&quot; data-origin-height=&quot;1180&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/v9vgp/btsC1n5JY8H/IDe7fYmKk6eF7WVkzGMfvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/v9vgp/btsC1n5JY8H/IDe7fYmKk6eF7WVkzGMfvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/v9vgp/btsC1n5JY8H/IDe7fYmKk6eF7WVkzGMfvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fv9vgp%2FbtsC1n5JY8H%2FIDe7fYmKk6eF7WVkzGMfvK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1454&quot; height=&quot;1180&quot; data-origin-width=&quot;1454&quot; data-origin-height=&quot;1180&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;핵심 개념
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;상태 : 시스템의 상태를 나타내는 정보&lt;/li&gt;
&lt;li&gt;행동 : 에이전트가 상태를 관측하고 그로부터 얻은 정보를 활용하여 행동을 선택함으로써 환경과 상호작용함&lt;/li&gt;
&lt;li&gt;보상 : 에이전트의 행동을 통해 다음 상태에 대한 보상값이 에이전트에게 주어짐.&lt;/li&gt;
&lt;li&gt;정책 : 에이전트의 행동 생성 함수를 정책이라고 한다. &lt;b&gt;정책은 상태로부터 행동을 도출하는 함수를 의미&lt;/b&gt;함.&lt;/li&gt;
&lt;li&gt;목적 : 에이전트가 받는 보상의 총합. 좋은 행동을 선택함으로써 목적을 최대로 달성하는 것이 목표.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;보상함수 $R(s_t, a_t, s_{t+1})$ 은 $(s_t, a_t, s_{t+1})$ 이라는 전이에 대해 하나의 스칼라 값을 할당하는데, 이 값은 양수, 음수, 0 모두 가능하다.&lt;/li&gt;
&lt;li&gt;상태공간, 행동공간, 보상함수는 환경에 따라 정의되고, 이를 모아서 $(s, a, r)$ 이라는 튜플로 정의되는데 이 튜플이 강화학습 시스템을 나타내는 기본적인 단위&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;강화학습에서 학습하는 함수&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;강화학습에서 학습하는 3개의 주요 함수&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;상태로부터 행동을 도출하는 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;정책&lt;/b&gt;&lt;/span&gt; $\pi : a \sim \pi(s)$&lt;/li&gt;
&lt;li&gt;이득의 기댓값 $E_\gamma[R(\tau)]$ 를 추정하기 위해 필요한 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;가치 함수&lt;/span&gt;&lt;/b&gt; $V^\pi(s)$ 또는 $Q^\pi(s, a)$&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;환경&lt;/span&gt;&lt;/b&gt; 모델 $P(s&amp;rsquo; | s, a)$&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정책은 확률론적으로 알 수 있다. 즉, 동일한 상태에 대해서 확률적으로 다양한 행동을 도출할 수 있다. 이 경우 주어진 상태 $s$에 대해서 행동 $a$가 도출될 확률을 $\pi(a|s)$ 로 나타낼 수 있다. 정채긍로부터 추출된 행동을 $a \sim \pi(s)$ 라고 표현한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;심층 강화학습이란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Deep NN을 함수의 근사 기법으로 사용하는 방식&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1444&quot; data-origin-height=&quot;976&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btiSTS/btsC4D7UkwU/ewYhJKo7jPhehzZvPYt2z1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btiSTS/btsC4D7UkwU/ewYhJKo7jPhehzZvPYt2z1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btiSTS/btsC4D7UkwU/ewYhJKo7jPhehzZvPYt2z1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtiSTS%2FbtsC4D7UkwU%2FewYhJKo7jPhehzZvPYt2z1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1444&quot; height=&quot;976&quot; data-origin-width=&quot;1444&quot; data-origin-height=&quot;976&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정책 기반 (policy-based) 방식
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정책 $\pi$ 를 학습. &lt;u&gt;에이전트의 목적을 최대로 만드는 궤적을 생성&lt;/u&gt;함.&lt;/li&gt;
&lt;li&gt;정책함수 $\pi$ 는 상태 $s$ 를 입력받아 행동 $a \sim \pi(s)$ 를 도출함&lt;/li&gt;
&lt;li&gt;매우 일반적인 최적화 방법으로, 에이전트가 가장 신경쓰는 목적함수 $J(r)$을 직접 최적화함&lt;/li&gt;
&lt;li&gt;단점 : 정책의 분산이 크고 훈련 과정이 표본 비효율적임.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;가치 기반 (value-based) 방식
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;u&gt;에이전트 상태 $s$에서 항상 $Q^\pi(s,a)$의 추정값을 가장 크게 만드는 행동 $a$를 선택하는 방법&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;DQN, Double DQN 등이 많이 쓰이고 있는 효과적인 알고리즘.&lt;/li&gt;
&lt;li&gt;일반적으로 정책 기반 알고리즘보다 표본 효율적 (sample-efficient) 다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;모델 기반 (model-based) 방식
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;환경의 전이역학(transition dynamics)에 대한 모델을 학습하거나 이리 알려진 모델을 학습함&lt;/li&gt;
&lt;li&gt;에이전트는 추정을 통해 환경 모델로부터 궤적의 예측값을 계산함.&lt;/li&gt;
&lt;li&gt;ex. 몬테카를로 트리 탐색&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;강화학습을 위한 심층학습&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;심층 신경망은 복잡한 비선형 함수를 근사하는데에 탁월한 능력을 가지고 있음.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;2015년 딥마인드가 아타리 게임에서 인간 수준의 성능을 달성한 이후 강화학습 분야에서 개발된 모든 중요한 방법들은 NN을 이용하여 함수를 근사하고 있다.&lt;/li&gt;
&lt;li&gt;신경망의 출력을 평가하는 손실 함수가 주어지면 신경망의 파라미터값을 변경하여 손실 함수가 최소가 되도록 하면서 성능을 향상시킬 수 있다. 이때 전역 최솟값 (global minimum)을 찾는 과정에서 손실함수가 가장 빠르게 감소하는 방향으로 파라미터를 변경하기 때문에 이러한 방법을 경사하강법(gradient descent)이라고 부른다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;강화학습과 지도학습&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;강화학습과 지도학습의 주된 차이점은 강화학습 문제에서는 모델의 모든 입력에 대해 &quot;정확한&quot; 답이 주어지지 않는 반면 지도학습에서는 모든 예제에 대해 정답 또는 최적의 답이 존재함.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;활성 정책과 비활성 정책 알고리즘&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;활성 정책 (on-policy) 알고리즘&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;알고리즘이 정책에 대해 학습하는 경우.&lt;/li&gt;
&lt;li&gt;정책에 대해 학습한다는 것은 훈련 과정에서 현재의 정책 $\pi$ 로부터 생성된 데이터만을 이용할 수 있다는 뜻.&lt;/li&gt;
&lt;li&gt;여러 정책 $\pi_1, \pi_2, \pi_3, &amp;hellip;$ 에 대해 훈련이 반복될 때, 훈련이 진행되는 바로 그 순간의 정책만을 이용하여 훈련 데이터를 생성한다는 것을 의미함.&lt;/li&gt;
&lt;li&gt;따라서 훈련이 끝난 후에는 데이터가 더이상 쓸모없어지므로 데이터는 폐기되어야함.&lt;/li&gt;
&lt;li&gt;표본 비효율적이며 더 많은 데이터를 필요로함.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;비활성 정책 (off-policy) 알고리즘&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;수집된 모든 데이터는 훈련을 위해 재사용 될 수 있다.&lt;/li&gt;
&lt;li&gt;표본 효율적이지만 이 경우 데이터를 저장하기 위한 메모리가 더 많이 필요할 수 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>머신러닝 꿈나무</category>
      <author>_rian</author>
      <guid isPermaLink="true">https://butter-shower.tistory.com/258</guid>
      <comments>https://butter-shower.tistory.com/258#entry258comment</comments>
      <pubDate>Fri, 5 Jan 2024 18:56:07 +0900</pubDate>
    </item>
    <item>
      <title>[혼공머신] 혼자 공부하는 머신러닝 &amp;amp; 딥러닝 1주차</title>
      <link>https://butter-shower.tistory.com/257</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;562&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBclPN/btsC4p2inkJ/qqWcehKEAz1hmk0jKuUeE1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBclPN/btsC4p2inkJ/qqWcehKEAz1hmk0jKuUeE1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBclPN/btsC4p2inkJ/qqWcehKEAz1hmk0jKuUeE1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBclPN%2FbtsC4p2inkJ%2FqqWcehKEAz1hmk0jKuUeE1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;562&quot; height=&quot;768&quot; data-origin-width=&quot;562&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Chapter 1. 나의 첫 머신러닝&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;머신러닝 : 규칙을 일일이 프로그래밍하지 않아도 자동으로 데이터에서 규칙을 찾아내는 알고리즘을 연구하는 분야&lt;/li&gt;
&lt;li&gt;딥러닝 : 인공신경망을 기반으로 한 방법들을 통칭&lt;/li&gt;
&lt;li&gt;첫번째 머신러닝 프로그램 : K-Nearest Neighbors 알고리즘으로 도미, 빙어 두 생선을 분류하기&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Chapter 2. 데이터 다루기&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-1. 훈련 세트와 테스트 세트&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;지도학습과 비지도 학습
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;지도학습 : 데이터와 &quot;정답&quot;이 있는 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;훈련 세트와 테스트 세트
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;훈련 세트 : 모델 훈련에 사용되는 데이터&lt;/li&gt;
&lt;li&gt;테스트 세트 : 평가에 사용되는 데이터&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;샘플링편향
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;훈련 세트와 테스트 세트에 샘플이 골고루 섞여있지 않고 한쪽으로 치우친 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-2. 데이터 전처리&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;훈련 세트와 테스트 세트로 나누기
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사이킷런의 &lt;code&gt;train_test_split()&lt;/code&gt; 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;데이터 전처리 (data preprocessing)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터 특성값을 일정한 기준으로 맞추는 것&lt;/li&gt;
&lt;li&gt;가장 널리 사용하는 방법 중 하나는 표준 점수 (standard score)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;미션&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기본 미션&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코랩 실습 화면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2784&quot; data-origin-height=&quot;3054&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgj6jv/btsC6U8r5eH/HNW5aujrprhxbAXQ2n0Wm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgj6jv/btsC6U8r5eH/HNW5aujrprhxbAXQ2n0Wm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgj6jv/btsC6U8r5eH/HNW5aujrprhxbAXQ2n0Wm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbgj6jv%2FbtsC6U8r5eH%2FHNW5aujrprhxbAXQ2n0Wm1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2784&quot; height=&quot;3054&quot; data-origin-width=&quot;2784&quot; data-origin-height=&quot;3054&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;선택 미션&lt;/h3&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Ch.02(02-1) 확인 문제 풀고 풀이 과정 정리하기&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제 : 머신러닝 알고리즘의 한 종류로서 샘플의 입력과 타깃을 알고있을 때 사용할 수 있는 학습 방법은 무엇인가요?&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정답 : 지도학습&lt;/li&gt;
&lt;li&gt;지도학습은 데이터의 정답이 주어지고 정답을 찾아나가도록 학습하는 것을 의미한다&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>머신러닝 꿈나무</category>
      <author>_rian</author>
      <guid isPermaLink="true">https://butter-shower.tistory.com/257</guid>
      <comments>https://butter-shower.tistory.com/257#entry257comment</comments>
      <pubDate>Fri, 5 Jan 2024 00:17:00 +0900</pubDate>
    </item>
    <item>
      <title>구글 Gemini에 관해 이모저모</title>
      <link>https://butter-shower.tistory.com/256</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;676&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OWmKl/btsB3aTyrYv/NP35kQRKdKUFmW7jOwTVhk/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OWmKl/btsB3aTyrYv/NP35kQRKdKUFmW7jOwTVhk/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OWmKl/btsB3aTyrYv/NP35kQRKdKUFmW7jOwTVhk/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOWmKl%2FbtsB3aTyrYv%2FNP35kQRKdKUFmW7jOwTVhk%2Fimg.webp&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;676&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;676&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근에 구글에서 나온 새로운 멀티모달 AI가 굉장히 화제이다. (이름이 무려 잼미니!!!)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 영상으로 되게 핫해졌는데 (9일전 영상이 무려 2백만회!!) 영상을 보면 되게 신기하다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=UIZAiXYceBI&amp;amp;ab_channel=Google&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.youtube.com/watch?v=UIZAiXYceBI&amp;amp;ab_channel=Google&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=UIZAiXYceBI&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/bBhgx4/hyUL4zTk2r/sOeKFb3BgbL8kNSUS8doPK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-original-url=&quot;&quot; data-video-title=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/UIZAiXYceBI&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 이후에 바로 설명하는 블로그가 올라왔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://blog.google/technology/ai/google-gemini-ai/?utm_source=tldrai#sundar-note&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://blog.google/technology/ai/google-gemini-ai/?utm_source=tldrai#sundar-note&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1702656246665&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Introducing Gemini: our largest and most capable AI model&quot; data-og-description=&quot;Gemini is our most capable and general model, built to be multimodal and optimized for three different sizes: Ultra, Pro and Nano.&quot; data-og-host=&quot;blog.google&quot; data-og-source-url=&quot;https://blog.google/technology/ai/google-gemini-ai/?utm_source=tldrai#sundar-note&quot; data-og-url=&quot;https://blog.google/technology/ai/google-gemini-ai/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/xPD2e/hyULUjLYid/ej5WCKcADK91nCiZ01gnb0/img.jpg?width=1300&amp;amp;height=731&amp;amp;face=0_0_1300_731&quot;&gt;&lt;a href=&quot;https://blog.google/technology/ai/google-gemini-ai/?utm_source=tldrai#sundar-note&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://blog.google/technology/ai/google-gemini-ai/?utm_source=tldrai#sundar-note&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/xPD2e/hyULUjLYid/ej5WCKcADK91nCiZ01gnb0/img.jpg?width=1300&amp;amp;height=731&amp;amp;face=0_0_1300_731');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Introducing Gemini: our largest and most capable AI model&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Gemini is our most capable and general model, built to be multimodal and optimized for three different sizes: Ultra, Pro and Nano.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;blog.google&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블로그 왈 GPT4보다 모든 부분에서 좋은 성능을 보이고 있다고도 하고 매우 안정적이고 확장가능한 면을 강조하고 있다. 뭔가 기술적인 내용은 별로 없어서 살짝 아쉽..&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래도 저 영상과 블로그 글이 올라오고 바로&amp;nbsp;12월 13일부로 API도 나와서 Google Cloud로 사용 가능하다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://cloud.google.com/vertex-ai/docs/generative-ai/model-reference/gemini&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://cloud.google.com/vertex-ai/docs/generative-ai/model-reference/gemini&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1702656290058&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Gemini API &amp;nbsp;|&amp;nbsp; Vertex AI &amp;nbsp;|&amp;nbsp; Google Cloud&quot; data-og-description=&quot;Send feedback Gemini API Stay organized with collections Save and categorize content based on your preferences. Preview Vertex AI Gemini API is a Preview offering, subject to the &amp;quot;Pre-GA Offerings Terms&amp;quot; in the General Service Terms section of the Service &quot; data-og-host=&quot;cloud.google.com&quot; data-og-source-url=&quot;https://cloud.google.com/vertex-ai/docs/generative-ai/model-reference/gemini&quot; data-og-url=&quot;https://cloud.google.com/vertex-ai/docs/generative-ai/model-reference/gemini&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Vl7l2/hyUL2hMpLa/DkG0RTWZJnCtrmkYomGKyK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://cloud.google.com/vertex-ai/docs/generative-ai/model-reference/gemini&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://cloud.google.com/vertex-ai/docs/generative-ai/model-reference/gemini&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Vl7l2/hyUL2hMpLa/DkG0RTWZJnCtrmkYomGKyK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Gemini API &amp;nbsp;|&amp;nbsp; Vertex AI &amp;nbsp;|&amp;nbsp; Google Cloud&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Send feedback Gemini API Stay organized with collections Save and categorize content based on your preferences. Preview Vertex AI Gemini API is a Preview offering, subject to the &quot;Pre-GA Offerings Terms&quot; in the General Service Terms section of the Service&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;cloud.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 파이썬으로 살짝 사용해보았는데 확실히 ChatGPT만큼 자연스러운 대화가 가능한 것 같다. 그런데 성능에 대해 왈가왈부 말이 많은데, 확실히 이게 정말 성능이 좋은거 맞아?? 라는 답변이 올때가 있었다. 그리고 아직 한글은 지원이 안되어서 영어로 해야하는 점도 살짝 아쉬운 점도 하나.&amp;nbsp;사람들의 chatGPT에 대한 신뢰가 만땅인 상태에서 나오는 어느 모델도 다 성에 차 보이진 않는듯.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 개발할 때 chatGPT를 정말 많이 쓰고있는데, 잼미니 모델이 나온지 얼마 안되어서 그런지 사용성과 체감상 성능 측면에선 확실히 압도적이다 라는 느낌은 든다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다 해도 개발자들이 활용하기 편하게 빠른 API 제공으로 다양한 잼미니 프로젝트들이 나올 것 같다! 또 잼미니 나노, 울트라, 프로 등등 목적을 구분해서 나온 점도 선택의 폭이 넓어져 좋은 점 중 하나! 나중에 한번&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;사이드로 하고싶은 이 마음 'ㅅ'...!!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;</description>
      <category>IT Trends</category>
      <author>_rian</author>
      <guid isPermaLink="true">https://butter-shower.tistory.com/256</guid>
      <comments>https://butter-shower.tistory.com/256#entry256comment</comments>
      <pubDate>Sat, 16 Dec 2023 01:12:38 +0900</pubDate>
    </item>
    <item>
      <title>spark에서 conda 가상환경 설정하기 &amp;amp; Jupyter에서 conda 가상환경 설정하기</title>
      <link>https://butter-shower.tistory.com/255</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;312&quot; data-origin-height=&quot;162&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mFNdv/btsyHIlwchT/d4HRa0U1JPTXmoQHcdmJV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mFNdv/btsyHIlwchT/d4HRa0U1JPTXmoQHcdmJV1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mFNdv/btsyHIlwchT/d4HRa0U1JPTXmoQHcdmJV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmFNdv%2FbtsyHIlwchT%2Fd4HRa0U1JPTXmoQHcdmJV1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;312&quot; height=&quot;162&quot; data-origin-width=&quot;312&quot; data-origin-height=&quot;162&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜 클러스터에 conda 가상환경을 설정해야할까?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클러스터는 수많은 컴퓨터들이 하나의 클러스터로 묶여있어 분산 처리를 하고있다.&lt;/li&gt;
&lt;li&gt;만약 새로운 패키지 설치 혹은 기존 패키지 업데이트가 필요한 경우 각각의 컴퓨터에 설치하거나 업데이트를 해줘야하기 때문에 번거로운 작업이면서 기존 버전과 충돌이 발생할 가능성이 존재함&lt;/li&gt;
&lt;li&gt;따라서, 클러스터에 프로젝트에 필요한 하나의 독립된 환경을 만들 필요가 있음. conda를 통해 특정 버전의 패키지와 의존성을 포함하는 독립적인 환경을 만들 수 있게 해줌.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;conda 환경 설정 방법 (spark client 모드에서)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. conda 환경 생성 및 패키지 설치&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서비스가 필요한 서버에 conda 가상환경을 생성해준다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;conda create -n my_env python=3.7&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 가상환경 활성화&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;conda activate my_env&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 필요한 각종 라이브러리 설치 및 ipykernel 패키지 설치&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;개발에 필요한 각종 라이브러리 설치하기
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;conda install prophet&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;conda 가상환경을 jupyter에서도 설정하기 위해 ipykernel 패키지 함께 설치하기
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;conda install ipykernel&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;conda 가상환경을 압축하는 conda-pack 라이브러리 설치하기
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;conda install conda-pack&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 패키지 설치 후 conda 가상환경 압축하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;conda pack&lt;/code&gt; 도구를 사용하여 가상환경을 압축한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;conda pack -n my_env -o my_env.tar.gz&lt;/code&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. 압욱된 가상환경 파일을 분산 파일 시스템(hdfs)에 업로드&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 클러스터들이 접근할 수 있는 hdfs에 가상환경 파일을 업로드해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;hadoop fs -put my_env.tar.gz hdfs://path/to/env&lt;/code&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6. YARN 클러스터의 모든 노드에 conda 환경 배포&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;spark-submit&lt;/code&gt; 명령을 실행할 때 &lt;code&gt;--archives&lt;/code&gt; 옵션을 사용하셔 conda 환경을 지정&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;--archives&lt;/code&gt; : conda 압축된 파일을 넣어줌. 스파크가 실행될 때 각 executor들에서 자동으로 압축을 해제함.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PYSPARK_PYTHON&lt;/code&gt; : executor가 파이썬을 실행하는 경로 설정&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PYSPARK_DIRVER_PATH&lt;/code&gt; : driver가 파이썬을 실행하는 경로 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;spark-submit \
--master yarn \
--deploy-mode client \
--archives hdfs://11stnds/user/dpst/env/prophet_test.tar.gz#prophet_test \
--conf spark.yarn.appMasterEnv.PYSPARK_PYTHON=./prophet_test/bin/python \
--conf spark.executorEnv.PYSPARK_PYTHON=./prophet_test/bin/python \
your_spark_job.py&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7. Jupyter Kernel 설정하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;conda 가상환경이 설치된 주피터 서버에서 커널을 새로 만들어준다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;커널들이 존재하는 경로로 이동
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;cd .local/share/jupyter/kernels&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;경로 새로 생성 &amp;amp; 이동
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;mkdir my_env&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cd my_env&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;해당 경로로 이동 후 아래와 같이 &lt;code&gt;kernel.json&lt;/code&gt; 생성&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;livescript&quot;&gt;&lt;code&gt;{
    &quot;argv&quot;: [
        &quot;/path/to/.conda/envs/prophet_test/bin/python&quot;, # conda 가상환경의 경로로 설정 
        &quot;-m&quot;,
        &quot;ipykernel_launcher&quot;,
        &quot;-f&quot;,
        &quot;{connection_file}&quot;
    ],
    &quot;display_name&quot;: &quot;my_env&quot;,
    &quot;language&quot;: &quot;python&quot;,
    &quot;env&quot;: {
        &quot;HADOOP_CONF_DIR&quot;: &quot;/path/to/hadoop&quot;,
        &quot;SPARK_HOME&quot;: &quot;/path/to/spark&quot;,
        &quot;PYTHONPATH&quot;: &quot;/path/to/python&quot;,
        &quot;PYSPARK_PYTHON&quot; : &quot;./prophet_test/bin/python&quot;, # executor에서 사용할 python 경로 설정 
        &quot;PYSPARK_DRIVER_PYTHON&quot; : &quot;//path/to/.conda/envs/prophet_test/bin/python&quot;, # driver에서 사용할 python 경로 설정
        &quot;PYSPARK_SUBMIT_ARGS&quot;: &quot;--master yarn --driver-memory 10g --executor-memory 20g --num-executors 15 --executor-cores 2 --archives hdfs://path/to/env/my_env.tar.gz#my_env --conf spark.yarn.appMasterEnv.PYSPARK_PYTHON=./my_env/bin/python --conf spark.executorEnv.PYSPARK_PYTHON=./my_env/bin/python --conf spark.driver.maxResultSize=10g --conf spark.sql.pivotMaxValues=99999 --deploy-mode client --queue RF pyspark-shell&quot;
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Computer Engineering</category>
      <author>_rian</author>
      <guid isPermaLink="true">https://butter-shower.tistory.com/255</guid>
      <comments>https://butter-shower.tistory.com/255#entry255comment</comments>
      <pubDate>Wed, 18 Oct 2023 14:47:14 +0900</pubDate>
    </item>
    <item>
      <title>파이썬에서 효율적으로 메모리 관리하는 방법 - del, 제너레이터, 가비지컬렉션</title>
      <link>https://butter-shower.tistory.com/254</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;533&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/64xfC/btsnuiYwniQ/kHzKE0r4vsjVh86BKyJ7f1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/64xfC/btsnuiYwniQ/kHzKE0r4vsjVh86BKyJ7f1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/64xfC/btsnuiYwniQ/kHzKE0r4vsjVh86BKyJ7f1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F64xfC%2FbtsnuiYwniQ%2FkHzKE0r4vsjVh86BKyJ7f1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;333&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;533&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬은 개발자가 직접 메모리를 관리하는 대신 언어 자체가 대부분의 메모리를 관리해 따로 처리할 필요가 없긴 하나, 코드가 길어지거나 다루는 데이터가 방대하거나 메모리 자원이 한정적일 때 파이썬에서도 메모리 사용을 최적화해주는 것이 필요하다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 사용하지 않는 객체 dealloc&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메모리 사용량을 줄이는 가장 간단한 방법은 사용하지 않는 객체를 삭제하는 것이다. &lt;code&gt;del&lt;/code&gt; 키워드를 사용하여 수행할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;a = [1, 2, 3, 4, 5, ...., 100000000]

# 객체 삭제
del a&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더이상 a 객체가 필요하지 않을 때 &lt;code&gt;del&lt;/code&gt; 키워드를 사용할 수 있다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 제너레이터 사용&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 리스트에 많은 양의 데이터가 들어가게 되는 경우 &lt;b&gt;제너레이터&lt;/b&gt;를 사용하는 방법도 좋은 고려방안이다. 제너레이터는 필요할때만 데이터를 생성하기때문에 한번에 하나의 항목만 메모리에 유지해 메모리를 크게 절약할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;# 리스트 사용
numbers_list = [i for i in range(1000000)]

# 제너레이터 사용
numbers_generator = (i for i in range(1000000))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리스트 타입은 가능하다면 제너레이터를 활용하거나 혹은 &lt;code&gt;array&lt;/code&gt; 모듈 또는 &lt;code&gt;numpy&lt;/code&gt; 라이브러리를 사용하는 것이 좋다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 가비지 컬렉션&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가비지 컬렉션이란?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가비지 컬렉션 (Garbage Collection)은 프로그램이 동적으로 할당했지만 더이상 사용하지 않는 메모리를 자동으로 회수하는 프로그램이다. 실제로는 사용하지 않지만 계속해서 메모리를 점유하고 있는 메모리 릭 (memory leak)을 방지하는 용도이다. 프로그래밍 언어에 따라 동작 방식이 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬은 가비지컬렉션을 사용해 메모리를 관리해 자동으로 사용하지 않는 메모리를 해제하고 있으나 수동으로 제어가 가능하다. &lt;code&gt;gc&lt;/code&gt; 모듈을 사용하면 가비지 컬렉션을 수동으로 제어할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;haskell&quot;&gt;&lt;code&gt;import gc

# 가비지 컬렉션 강제 실행
gc.collect()&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Computer Engineering/Python</category>
      <author>_rian</author>
      <guid isPermaLink="true">https://butter-shower.tistory.com/254</guid>
      <comments>https://butter-shower.tistory.com/254#entry254comment</comments>
      <pubDate>Thu, 13 Jul 2023 14:43:37 +0900</pubDate>
    </item>
    <item>
      <title>Pyspark에서 데이터 파티션 관리방법 - partitionBy()</title>
      <link>https://butter-shower.tistory.com/253</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;451&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjkBpx/btslKEaJ5UL/KwqufT4ogWKDtjkU3SaAmk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjkBpx/btslKEaJ5UL/KwqufT4ogWKDtjkU3SaAmk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjkBpx/btslKEaJ5UL/KwqufT4ogWKDtjkU3SaAmk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjkBpx%2FbtslKEaJ5UL%2FKwqufT4ogWKDtjkU3SaAmk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;282&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;451&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 파티셔닝은 대용량의 데이터를 처리할 때 중요한 개념이다. 파티셔닝에 관한 자세한 글은 아래 링크를 참고. &lt;a href=&quot;https://gmlwjd9405.github.io/2018/09/24/db-partitioning.html&quot;&gt;https://gmlwjd9405.github.io/2018/09/24/db-partitioning.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1687942479350&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;[DB] DB 파티셔닝(Partitioning)이란 - Heee's Development Blog&quot; data-og-description=&quot;Step by step goes a long way.&quot; data-og-host=&quot;gmlwjd9405.github.io&quot; data-og-source-url=&quot;https://gmlwjd9405.github.io/2018/09/24/db-partitioning.html&quot; data-og-url=&quot;http://gmlwjd9405.github.io/2018/09/24/db-partitioning.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/CdtHx/hyS9R8QQJ9/lU5zsWmT413iWIXSqHzogk/img.png?width=2003&amp;amp;height=1226&amp;amp;face=0_0_2003_1226,https://scrap.kakaocdn.net/dn/znQfj/hyS8kEPBtA/PHh9HrhE2qBZMHq2Hg2W81/img.png?width=1851&amp;amp;height=787&amp;amp;face=0_0_1851_787,https://scrap.kakaocdn.net/dn/s204c/hyS9IjLBCy/yA4ckH176aZkKrMK8rSY1k/img.png?width=1851&amp;amp;height=787&amp;amp;face=0_0_1851_787&quot;&gt;&lt;a href=&quot;https://gmlwjd9405.github.io/2018/09/24/db-partitioning.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://gmlwjd9405.github.io/2018/09/24/db-partitioning.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/CdtHx/hyS9R8QQJ9/lU5zsWmT413iWIXSqHzogk/img.png?width=2003&amp;amp;height=1226&amp;amp;face=0_0_2003_1226,https://scrap.kakaocdn.net/dn/znQfj/hyS8kEPBtA/PHh9HrhE2qBZMHq2Hg2W81/img.png?width=1851&amp;amp;height=787&amp;amp;face=0_0_1851_787,https://scrap.kakaocdn.net/dn/s204c/hyS9IjLBCy/yA4ckH176aZkKrMK8rSY1k/img.png?width=1851&amp;amp;height=787&amp;amp;face=0_0_1851_787');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[DB] DB 파티셔닝(Partitioning)이란 - Heee's Development Blog&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Step by step goes a long way.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;gmlwjd9405.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Pyspark에서는 &lt;code&gt;DataFrameWriter&lt;/code&gt;와 &lt;code&gt;partitionBy()&lt;/code&gt; 메소드를 사용하여 &lt;b&gt;데이터프레임을 특정 열 기준으로 파티션&lt;/b&gt;할 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 파티션을 지정하여 새로운 테이블을 생성할 경우&lt;/h3&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;df.write\
    .partitionBy('part_date')\
    .format('parquet')\
    .saveAsTable(TABLE_NAME)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드는 &lt;code&gt;part_date&lt;/code&gt;를 기준으로 DataFrame을 파티셔닝하고 그 결과를 parquet 현식의 테이블로 저장하는 방법이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 기존에 있는 테이블에 새로운 파티션의 내용을 추가하고 싶은 경우 - &lt;code&gt;insertInto()&lt;/code&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 테이블이 존재하고 새 파티션에 데이터를 저장하고 싶다면 write mode를 &lt;b&gt;overwrite&lt;/b&gt;로 변경하고 &lt;code&gt;insertInto()&lt;/code&gt; 명령어와 함께 사용해준다.&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;df.write\
    .format('parquet')\
    .mode('append')\
    .insertInto(TABLE_NAME)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 기존 테이블의 파티션 구조를 그대로 유지하면서 새로운 데이터를 추가할 수 있게 해준다.&lt;/p&gt;</description>
      <category>Computer Engineering</category>
      <author>_rian</author>
      <guid isPermaLink="true">https://butter-shower.tistory.com/253</guid>
      <comments>https://butter-shower.tistory.com/253#entry253comment</comments>
      <pubDate>Wed, 28 Jun 2023 17:55:38 +0900</pubDate>
    </item>
    <item>
      <title>YARN Cluster에 연결된 Spark로 pyspark - Oracle 데이터베이스 연결하기</title>
      <link>https://butter-shower.tistory.com/252</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpkyjD/btsjaINd4NR/xxUF23PpeeTS5KxwsNzp5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpkyjD/btsjaINd4NR/xxUF23PpeeTS5KxwsNzp5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpkyjD/btsjaINd4NR/xxUF23PpeeTS5KxwsNzp5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpkyjD%2FbtsjaINd4NR%2FxxUF23PpeeTS5KxwsNzp5K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;375&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Step 1. OJDBC 드라이버 설정&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.oracle.com/kr/database/technologies/appdev/jdbc.html&quot;&gt;https://www.oracle.com/kr/database/technologies/appdev/jdbc.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1686201628186&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;JDBC 드라이버 | Oracle 대한민국&quot; data-og-description=&quot;클라우드에서도, 온프레미스에서도, Oracle Autonomous Databases를 활용하면 Java 애플리케이션을 쉽고 빠르게 개발할 수 있습니다. Java 개발자들은 Oracle Autonomous Database, 성능 셀프 튜닝, 고가용성, 인메&quot; data-og-host=&quot;www.oracle.com&quot; data-og-source-url=&quot;https://www.oracle.com/kr/database/technologies/appdev/jdbc.html&quot; data-og-url=&quot;https://www.oracle.com/kr/database/technologies/appdev/jdbc.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/EcJEb/hySVDpVtDz/22oRh21F65F8HxjJdik0Lk/img.jpg?width=442&amp;amp;height=250&amp;amp;face=0_0_442_250&quot;&gt;&lt;a href=&quot;https://www.oracle.com/kr/database/technologies/appdev/jdbc.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.oracle.com/kr/database/technologies/appdev/jdbc.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/EcJEb/hySVDpVtDz/22oRh21F65F8HxjJdik0Lk/img.jpg?width=442&amp;amp;height=250&amp;amp;face=0_0_442_250');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;JDBC 드라이버 | Oracle 대한민국&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;클라우드에서도, 온프레미스에서도, Oracle Autonomous Databases를 활용하면 Java 애플리케이션을 쉽고 빠르게 개발할 수 있습니다. Java 개발자들은 Oracle Autonomous Database, 성능 셀프 튜닝, 고가용성, 인메&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.oracle.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;JDBC란?
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Java Database Connectivity의 약자로, &lt;u&gt;자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;일관된 방식으로 데이터베이스에 접근할 수 있게 해주므로 구체적인 데이터베이스의 시스템 세부사항을 걱정하지 않고도 작업을 수행할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Pyspark, JVM 등 적절한 버전을 찾아 다운로드한다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ojdbc.jar&lt;/code&gt; 는 spark의 각각 driver, executor, yarn 클러스터가 읽을 수 있는 경로에 위치해야 하는데,
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Deploy Mode가 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;Local&lt;/span&gt;인 경우 jdbc는 local머신에 위치하여 spark의 driver, executor가 읽을 수 있는 곳에 위치해야 하고&lt;/li&gt;
&lt;li&gt;Deploy Mode가 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;Client&lt;/span&gt;인 경우 driver는 클라이언트에, executor는 클러스터에 위치하고&lt;/li&gt;
&lt;li&gt;Deploy Mode가 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;Cluster&lt;/span&gt;인 경우 driver, executor가 모두 클러스터에 위치해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Step 2. Spark Session 설정&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Pyspark 스크립트 내에서 Spark Session을 설정하자&lt;/li&gt;
&lt;li&gt;여기에서 &lt;code&gt;spark.driver.extraClassPath&lt;/code&gt;와 &lt;code&gt;spark.executor.extraClassPath&lt;/code&gt;, 그리고 YARN 클러스터를 사용한다면 &lt;code&gt;spark.yarn.jars&lt;/code&gt;에서 ojdbc 드라이버의 위치를 지정해줘야 한다.&lt;/li&gt;
&lt;li&gt;아래 예시에서는 &lt;i&gt;client mode&lt;/i&gt;이기 때문에 spark의 driver와 executor의 ojdbc 경로 위치가 다르다.&lt;/li&gt;
&lt;li&gt;또한 YARN 클러스터를 사용하고 있는 경우 모든 executor들이 접근할 수 있는 위치에 ojdbc가 위치해주어야하고 그것은 HDFS에 위치해있기 때문에 HDFS 경로를 넣어주었다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;from pyspark import SparkConf, SparkContext, StorageLevel
from pyspark.sql import SparkSession, SQLContext

# ojdbc 경로 위치
ojdbc_local_path = &quot;/path/to/ojdbc8.jar&quot;
ojdbc_cluster_path = &quot;hdfs://path/to/ojdbc8.jar&quot;

# spark - YARN 클러스터 셋팅
appName = &quot;Test&quot;
spark = SparkSession.builder\
                    .appName(appName)\
                    .config(&quot;spark.jars&quot;, ojdbc_local_path)\
                    .config(&quot;spark.yarn.jars&quot;, ojdbc_cluster_path)\
                    .config(&quot;spark.driver.extraClassPath&quot;, ojdbc_local_path)\
                    .config(&quot;spark.executor.extraClassPath&quot;, ojdbc_cluster_path)

sc = spark.sparkContext&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Step 3. JDBC 연결 설정&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;JDBC를 통해 연결하고자 하는 데이터베이스의 정보를 입력해주어야 한다.&lt;/li&gt;
&lt;li&gt;데이터베이스 서버의 IP, Port, DB명, ID(useR), password 등의 정보가 필요하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# Oracle 연결 정보
ip = &quot;&quot;
port = &quot;&quot;
service_name = &quot;&quot;
user = &quot;&quot;
password = &quot;&quot;

# spark - oracle 연결 정보
driver_format = &quot;jdbc&quot;
driver = &quot;oracle.jdbc.OracleDriver&quot;
url = f&quot;jdbc:oracle:thin:@//{ip}:{port}/{service_name}&quot;
fetchsize = 1000
query = &quot;select * from TABLE_NM&quot;

# 데이터 읽기
df = spark.read.format(driver_format)\
                .option(&quot;url&quot;, url)\
                .option(&quot;driver&quot;, driver)\
                .option(&quot;user&quot;, user)\
                .option(&quot;password&quot;, password)\
                .option(&quot;query&quot;, query)\
                .option(&quot;fetchsize&quot;, fetchsize)\
                .load()&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여기에서 spark의 driver와 모든 executor 노드들이 데이터베이스 서버와 방화벽이 해제되어있어야 정상적으로 connection이 된다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Computer Engineering</category>
      <author>_rian</author>
      <guid isPermaLink="true">https://butter-shower.tistory.com/252</guid>
      <comments>https://butter-shower.tistory.com/252#entry252comment</comments>
      <pubDate>Thu, 8 Jun 2023 14:24:18 +0900</pubDate>
    </item>
  </channel>
</rss>