<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>seonyoung_3.log</title>
        <link>https://velog.io/</link>
        <description>원하는 바를 이루고 싶은 사람입니다.</description>
        <lastBuildDate>Wed, 02 Oct 2024 08:19:55 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. seonyoung_3.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/seonyoung_3" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[Spark] 클라우드]]></title>
            <link>https://velog.io/@seonyoung_3/Spark-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C</link>
            <guid>https://velog.io/@seonyoung_3/Spark-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C</guid>
            <pubDate>Wed, 02 Oct 2024 08:19:55 GMT</pubDate>
            <description><![CDATA[<h3 id="📁-클라우드">📁 클라우드</h3>
<ul>
<li><strong>관리가 훨씬 쉽고, 보안이 뛰어나며, 가용성이 좋음</strong></li>
<li>스파크를 쓸 때는 여러 대의 컴퓨터를 사용하는데, 보통 클라우드의 서버를 빌림
<img src="https://velog.velcdn.com/images/seonyoung_3/post/e54df5c3-9330-4ed3-9700-7e398972dd24/image.png" alt=""></li>
</ul>
<h3 id="📁-클라우드-3대장">📁 클라우드 3대장</h3>
<p><img src="https://velog.velcdn.com/images/seonyoung_3/post/ccab1afb-ea86-4e5c-892b-0e248f0cc825/image.png" alt=""></p>
<ul>
<li><code>AWS</code> : 지금까지 시장을 지배해왔고, 앞으로도 그럴 가능성이 높음<ul>
<li>한 번 시장을 지배한 이후로, 모든 것의 기준이 되었음</li>
</ul>
</li>
<li><code>GCP</code> : <code>Bigquery</code> 원툴일 수 있지만, 그 원툴이 너무 강력</li>
<li><code>Azur</code>e : 편하지만, 비쌈</li>
<li>그 외 여러 가지 이유(지원, 투자, 계열사 등)로 기타 클라우드를 사용하는 경우도 많음</li>
</ul>
<h3 id="📁-스토리지">📁 스토리지</h3>
<ul>
<li>AWS를 이용하게 되면 기본적으로 대부분의 파일(데이터)를 S3에 보관<ul>
<li>내 컴퓨터에 보관하는 것보다 안전하며, 임의의 팀원이 접근할 수 있음</li>
</ul>
</li>
<li>그 데이터를 다시 데이터베이스에 연결하여 사용할 수도 있음</li>
<li>스파크는 S3에서 직접 읽을 수도, DB를 통해 읽을 수도 있음</li>
<li>비용에 주의하면 좋음</li>
</ul>
<blockquote>
<h4 id="📌-amazon-s3란">📌 Amazon S3란?</h4>
</blockquote>
<ul>
<li>Amazon S3는 업계 최고의 확장성, 데이터 가용성 및 보안과 성능을 제공하는 객체 스토리지 서비스</li>
<li>데이터 레이크, 웹사이트, 클라우드 네이티브 애플리케이션, 백업, 아카이브, 기계학습 및 분석과 같은 다양한 사용 사례에 대한 원하는 양의 데이터를 저장하고 보호</li>
<li>Amazon S3는 99.999999999(9가 11개)의 내구성을 제공하도록 설계되었으며, 전세계 수백만 고객을 위해 데이터를 저장함</li>
</ul>
<h3 id="📁-엔진">📁 엔진</h3>
<p><img src="https://velog.velcdn.com/images/seonyoung_3/post/f10472a3-bbf2-4695-8e76-1d27fa888bb0/image.png" alt=""></p>
<ul>
<li>쉽게 말해 컴퓨터를 빌리는 것</li>
<li>단일 기기를 빌릴 수도 있고, 여러 대를 빌려쓸 수도 있음</li>
<li>접속은 보통 ssh를 이용하고, vscode를 이용하면 좀 더 편리할 수 있음</li>
</ul>
<h3 id="📁-데이터베이스">📁 데이터베이스</h3>
<ol>
<li>데이터 공유 : 데이터베이스는 여러 사용자가 동시에 접근하여 데이터를 공유할 수 있음 </li>
<li>데이터 보호 : 데이터베이스는 데이터를 보호하기 위해 다양한 보안 기능을 제공 </li>
<li>데이터 검색 : 데이터베이스는 데이터를 쉽게 검색할 수 있도록 인덱싱 기능을 제공 </li>
<li>데이터 백업과 복원 : 데이터베이스는 데이터를 백업하고 복원하는 기능을 제공하여 데이터 손실을 방지 → 이를 통해 중요한 데이터를 안전하게 보호할 수 있음</li>
</ol>
<ul>
<li>수십가지 데이터베이스가 있는데, 서로 다른 세 가지 유형 확인</li>
<li><code>RDS</code> : 관계형 데이터베이스<ul>
<li>postgres와 mysql 등 다양한 옵션이 있는데, 보통 엔지니어가 결정한 걸 따르면 됨</li>
<li>대동소이하며, 위에서 언급한 인덱싱을 잘 활용하면 좋음</li>
<li>항상 서버가 떠 있어야 하며, 그렇기 때문에 그 비용이 나감</li>
</ul>
</li>
<li><code>Athena</code> : S3에 있는 데이터를 직접 간편하게 분석할 수 있는 대화형 쿼리 서비스<ul>
<li>보통 S3에 있는 데이터와 연동</li>
<li>Serverless라고 하여, 쿼리를 운용할 때만 잠시 기기를 빌려 연산한 뒤 다시 반납<ul>
<li>따라서 비용이 저렴한 것이 보통</li>
</ul>
</li>
<li>바로 Spark와 연동할 수도 있음</li>
</ul>
</li>
<li><code>Redshift</code> : 빠르고 강력한 데이터 웨어하우징<ul>
<li>구동을 위해서는 클러스터(여러 대의 컴퓨터)를 구성하여 운영하여야 함(비쌈)</li>
<li>복잡한 연산에 조금 더 효율적</li>
<li>역시, Spark와 연동할 수 있음</li>
</ul>
</li>
</ul>
<h3 id="📁-아키텍쳐-예시">📁 아키텍쳐 예시</h3>
<p><img src="https://velog.velcdn.com/images/seonyoung_3/post/f25b8671-7fbd-4caa-9137-efee432003a3/image.png" alt=""></p>
<h3 id="📁-emr">📁 EMR</h3>
<ul>
<li>페타바이트급 데이터 처리, 대화식 분석 및 기계 학습을 위한 빅 데이터 솔루션</li>
<li>AWS에서 Spark를 사용하면, 보통 EMR을 이용</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Spark] 파일 유형]]></title>
            <link>https://velog.io/@seonyoung_3/Spark-%ED%8C%8C%EC%9D%BC-%EC%9C%A0%ED%98%95</link>
            <guid>https://velog.io/@seonyoung_3/Spark-%ED%8C%8C%EC%9D%BC-%EC%9C%A0%ED%98%95</guid>
            <pubDate>Tue, 01 Oct 2024 11:38:12 GMT</pubDate>
            <description><![CDATA[<h3 id="📁-file-format">📁 File format</h3>
<ul>
<li>다양한 파일 유형이 있는데, 크게 시간적 비용과 공간적 비용으로 장단점을 비교</li>
<li><strong>시간적 비용</strong>: 읽고 쓰는데 걸리는 시간<ul>
<li>파일 유형에 따라 수십배까지 차이가 남</li>
</ul>
</li>
<li><strong>공간적 비용</strong>: 저장된 파일의 크기를 가리킴<ul>
<li>마찬가지로 파일 유형에 따라 수십배까지 차이가 남</li>
<li>좀 더 나아가, 입/출력 시에 필요한 메모리도 굉장히 중요</li>
</ul>
</li>
</ul>
<h3 id="📁-csv-txt">📁 csv, txt</h3>
<ul>
<li>가장 흔한 포맷으로, 개발이나 분석 직군이 아닌 사람도 많이 다룸</li>
<li>CSV는 Comma-separated values의 약자로, 콤마로 구분된 정형 데이터를 가리킴<ul>
<li>Comma(<code>,</code>) 대신 Tab(<code>\t</code>)과 같은 다른 <strong>구분자seperator</strong>를 사용할 수도 있음</li>
<li><strong>데이터 안에 구분자가 들어있는 경우</strong>, 방어할 수는 있지만 깨질 위험이 있음</li>
</ul>
</li>
<li>가장 느리고, 무거워서 소규모 데이터가 아니면 부적절</li>
<li>내부적으로는 <strong>encoding</strong>(utf-8, cp949 등)에 따라 다르게 저장됨</li>
</ul>
<h3 id="📁-json">📁 json</h3>
<ul>
<li><p>csv, txt와 크게 다르지는 않음</p>
</li>
<li><p>단, 저장된 자료를 python의 <strong>dictionary와 같은 형식</strong>으로 강제하며, 이를 JSON Object라 함</p>
<ul>
<li>ex) <code>{”키”:”값”}</code> / <code>{KEY : Value}</code></li>
<li>dict와 같은 것은 아님 / 파이썬의 dict를 json으로 변환하여 사용할 수 있으며, 이를 dump한다고 함</li>
<li>좀 더 자세히 들어가면 byte serialize를 이해해야겠지만, 여기서는 생략</li>
</ul>
</li>
<li><p>여러 JSON Object를 JSON Array에 담을 수 있음</p>
</li>
<li><p>비교적 개발자의 선호도가 높으며, 비교적 대용량의 데이터도 JSON으로 관리하는 경우가 많음</p>
<ul>
<li>API 통신도, 보통 JSON 형식으로 함</li>
<li>하지만 여전히 무거워서 대용량 데이터를 다루는데는 불편</li>
</ul>
</li>
<li><p>txt와 마찬가지로 encoidng방법에 따라 다르게 저장되는데, <strong>utf-8을 사용하는 것이 일반적</strong></p>
<h3 id="📁-pickle">📁 Pickle</h3>
<ul>
<li>하나의 컴퓨터로 <strong>개인용 프로젝트</strong>에서 데이터를 관리할 때 편리한 데이터 형식<ul>
<li>버전과 운영체제에 대한 <strong>의존Dependency</strong>이 있기 때문에 협업할 때 데이터를 주고 받으면 작동하지 않을 위험이 있음</li>
</ul>
</li>
</ul>
</li>
<li><p>위의 유형(csv, json)보다 2~30% 정도 용량이 가벼움</p>
<ul>
<li><strong>read/write 속도가 수십배 이상 빠름</strong></li>
</ul>
</li>
</ul>
<h3 id="📁-parquet">📁 Parquet</h3>
<p><img src="https://velog.velcdn.com/images/seonyoung_3/post/3543bbdb-0a31-4cf4-b02c-d3ed27b763d7/image.png" alt=""></p>
<ul>
<li>대용량 데이터 저장에서 <strong>표준</strong> (보통 “파케이”라고 읽음)</li>
<li><strong>굉장히 가볍고, 빠름!</strong></li>
<li>다수의 OLAB Database가 내부적으로 parquet를 사용하여 데이터를 저장
<img src="https://velog.velcdn.com/images/seonyoung_3/post/e9f8cdaf-0948-475c-819e-f8625f7fe139/image.png" alt=""></li>
<li>Spark 또한 Parquet를 지원</li>
</ul>
<h3 id="📁-기타">📁 기타</h3>
<ul>
<li>arrow나 hdfs, feather도 때에 따라 유용하게 사용됨</li>
<li>위와 같은 압축, 속도가 가능한 이유는 기본적으로 <strong>칼럼기반columnnar</strong>이기 때문</li>
</ul>
<h3 id="📁-io">📁 I/O</h3>
<ul>
<li>Input &amp; Output을 가리킴</li>
<li>다양한 맥락에서 쓰이지만, 여기서는 <strong>데이터의 입출력</strong>을 말하는 것</li>
</ul>
<h4 id="io의-메모리-사용">&lt;I/O의 메모리 사용&gt;</h4>
<ul>
<li>전처리에서 잘 돌던 데이터가, 저장save에서 터지는(OOM) 경우가 있음</li>
</ul>
<h4 id="io-speed">&lt;I/O Speed&gt;</h4>
<ul>
<li>언급한 것 중 가장 <strong>빠른 데이터 수급은 메모리</strong><ul>
<li>좀 더 자세히는 Network &lt; Disk &lt; Memory</li>
<li>이러한 이유로 In-memory DB를 사용하기도 함</li>
</ul>
</li>
<li>스파크는 기본적으로 <strong>모든 데이터를 Memory에서 처리</strong><ul>
<li>내부적으로는 lazy computation 등으로 좀 더 복잡</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Spark] 스파크, 파이썬과 데이터]]></title>
            <link>https://velog.io/@seonyoung_3/%EC%8A%A4%ED%8C%8C%ED%81%AC</link>
            <guid>https://velog.io/@seonyoung_3/%EC%8A%A4%ED%8C%8C%ED%81%AC</guid>
            <pubDate>Fri, 27 Sep 2024 10:56:56 GMT</pubDate>
            <description><![CDATA[<ul>
<li>대규모 데이터 전처리에 있어 스파크는 표준</li>
<li>실제 많은 회사가 스파크를 운용하고 있기에 협업 차원에서 도움이 됨</li>
</ul>
<h3 id="📁-스파크란">📁 스파크란?</h3>
<ul>
<li><code>Apache Spark</code> : SQL, 스트리밍, 머신러닝 및 그래프 처리를 위한 기본 제공 모듈이 있는 대규모 데이터 처리용 통합 분석 엔진</li>
<li><strong>대용량 데이터를 다루는 것에 특화된 프레임 워크</strong><ul>
<li>Pyspark: Python을 기반으로 하여 별도의 언어 공부가 필요 없음</li>
<li>대용량 데이터: 대용량 데이터를 다루는 기술에 대한 이해</li>
<li>분산 처리: 여러 대의 컴퓨터를 사용한다는 것에 대한 이해</li>
</ul>
</li>
</ul>
<h3 id="📁-스파크-사용-이유">📁 스파크 사용 이유</h3>
<ul>
<li><strong>대용량 데이터 사용 시 사용할 수밖에 없음</strong></li>
<li>ex) 800GB의 Microsoft Academic Graph 데이터를 다룰 때, 스파크를 쓸 수밖에 없음</li>
<li>대용량 데이터 처리는 <strong>분할Partition</strong>하여 처리함으로써 스파크를 우회할 수 있지만, Graph 형식의 데이터는 분할하기 어려워 부득이 스파크를 사용</li>
<li>약 10~20대의 컴퓨터를 사용하여 수백만건의 논문 데이터를 교정할 수 있음
<img src="https://velog.velcdn.com/images/seonyoung_3/post/dc012040-80c9-4043-abb4-0c584f69eddd/image.png" alt=""></li>
</ul>
<h3 id="📁-파이썬-메모리-이슈로-터짐">📁 파이썬 메모리 이슈로 터짐</h3>
<ul>
<li>파이썬 작업을 하다보면 아래와 같은 이유를 알 수 없는 에러가 종종 발생<ul>
<li>이는 일반적으로 컴퓨터 공학에서는 OOM(Out of Memory)이라 하며, 특히 대용량 데이터를 처리할 때는 자주 만나게 될 문제</li>
<li><strong>스파크를 쓰든, 파이썬을 쓰든 메모리의 관리는 굉장히 중요</strong>
<img src="https://velog.velcdn.com/images/seonyoung_3/post/10a085b9-f7dd-4d5c-8f4b-512d9a4a9562/image.png" alt=""></li>
</ul>
</li>
</ul>
<h3 id="📁-메모리">📁 메모리</h3>
<ul>
<li><p>메모리 : 기억 장치</p>
<ul>
<li><p>굉장히 세분화가 되어 있지만 크게 RAM과 Disk(SSD)로 나눔</p>
</li>
<li><p>RAM : 쉽게 말해 작업 공간</p>
<ul>
<li>데이터를 갖고 작업하기 위해 우리는 데이터를 RAM이란 곳에 올림(read_csv 등)</li>
<li>여기에 OS(윈도우 등)와 기본적인 프로그램을 올리면 2~6GB 정도 차지함</li>
<li>컴퓨터를 끄면 RAM에 올라간 데이터는 삭제됨</li>
</ul>
</li>
<li><p>Disk : 쉽게 말해 저장 공간</p>
<ul>
<li>장기적으로 데이터를 보관(저장)하는 공간</li>
<li>컴퓨터를 꺼도, Disk의 데이터는 사라지지 않음</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="📁-cpu">📁 CPU</h3>
<ul>
<li>CPU : 일꾼, 보통 컴퓨터는 여러 일꾼을 가지고 있음</li>
<li>모두 이해할 필요는 없으며, 가장 중요한 것은 코어의 수라고 봐도 됨</li>
<li>같은 코어 수라도, 고성능의 CPU는 수배 이상 빠를 수 있음</li>
<li>하나의 작업을 위해 여러 코어를 사용하는 것을 <strong>병렬 처리</strong><ul>
<li>스파크 또한 <strong>여러 대의 PC</strong>를, 그리고 <strong>각 PC의 여러 코어를 모두 사용</strong></li>
</ul>
</li>
</ul>
<h3 id="📁-data-type">📁 Data type</h3>
<ul>
<li>내부적으로는 각 데이터에 대한 명확한 타입이 있음<ul>
<li>적절한 데이터 타입을 사용하면, 보통 30% 이상의 메모리를 절약할 수 있음</li>
</ul>
</li>
</ul>
<h3 id="📁-정수integers">📁 정수(Integers)</h3>
<ul>
<li>컴퓨터에서는 정수를 이진법으로 표현<ul>
<li>뒤의 숫자는 얼마나 많은 메모리를 할당assign할 것인지에 대한 얘기
<img src="https://velog.velcdn.com/images/seonyoung_3/post/1e209d89-efa4-4d44-9edb-5638a6fb8bc9/image.png" alt=""></li>
</ul>
</li>
<li>더 많은 메모리를 할당할수록, 더 큰 숫자를 담을 수 있음
<img src="https://velog.velcdn.com/images/seonyoung_3/post/bde5341c-f737-4e9f-b243-0362890f56cb/image.png" alt=""></li>
<li><code>int8:-128 ~ 127</code></li>
<li><code>int16: -32768 ~ 32727</code></li>
<li><code>Int32: -2,147,483,648 ~ 2,147,483,647</code></li>
<li><code>Int64: -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807</code>
→ 엄밀히는, 부호를 위해 1비트(메모리의 단위)를 사용</li>
</ul>
<h3 id="📁-오버플로overflow">📁 오버플로(Overflow)</h3>
<ul>
<li>크기에 맞지 않는 데이터를 넣어 의도하지 않은 결과가 나오는것을 <strong>오버플로overflow</strong></li>
<li>정확한 정의는 좀 더 복잡</li>
<li>파이썬의 데이터 타입은 기본적으로 <strong>동적Dynamic</strong>이기 때문에 자동으로 데이터형이 바뀜</li>
<li>따라서 큰 숫자를 다루는 것은 굉장히 주의해야 함!</li>
</ul>
<h3 id="📁-부동소수점floating-points">📁 부동소수점(Floating points)</h3>
<ul>
<li><p>부동소수점 : 사람에게 직관적이지 않지만, 컴퓨터는 부득이 사용하는 개념</p>
<ul>
<li>앞에서 보았듯 컴퓨터는 <strong>이진법</strong>을 사용하기 때문에, 정수는 어렵지 않게 표현할 수 있음</li>
<li>하지만 0.2, 18.5, $\pi$와 같은 정수가 아닌 숫자는 정확하게 표현할 수 없음
→ <code>5.96e-54</code>같은 게 바로 부동소수점</li>
</ul>
</li>
<li><p>부동소수점은 하나의 숫자를 형태와 자릿수로 구분하여 표현하는 것</p>
<ul>
<li>ex) $478.224 = 4.78224 * 10^2$, $0.0098765 = 9.8765 * 10^-3$</li>
<li>일부의 데이터는 형태(4.78224)를, 나머지 데이터로 자릿수(2)를 표현</li>
<li>이진법이고, 소수부와 정수부가 다르기 때문에 정확하게는 조금 다름</li>
</ul>
</li>
<li><p>부동소수점 또한 정수와 마찬가지로 float16, float64 등을 사용하는데, 더 큰 메모리를 사용할수록 값이 정확해지지만 데이터가 더 무거워짐</p>
</li>
</ul>
<h3 id="📁-부동소수점-오차">📁 부동소수점 오차</h3>
<ul>
<li>부동소수점은 그 원리상 필연적으로 오차를 동반
<img src="https://velog.velcdn.com/images/seonyoung_3/post/841ec47c-026f-4af5-ad9f-0808d461c3e7/image.png" alt=""></li>
<li>이러한 오차는 더 많은 메모리(16 → 32)를 사용할수록 줄어들지만, 이론적으로는 <strong>무한히 많은 메모리</strong>를 사용해야만 이 오차를 정확히 없앨 수 있음</li>
<li>딥러닝의 경우 메모리 사용을 줄이기 위해, 의도적으로 오차를 감수해서라도 메모리를 줄이기도 함(float 16등)</li>
</ul>
<h3 id="📁-string-category">📁 String, Category</h3>
<ul>
<li>문자열은 문제가 더 복잡함</li>
<li>일반적으로 우리에게 친숙한 대부분의 소프트웨어는 <a href="https://ko.wikipedia.org/wiki/%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C_0000~0FFF"><code>유니코드unicode</code></a>를 이용하여 문자열을 인코딩</li>
<li>이러한 원리를 모두 지금 이해할 필요는 없음</li>
<li>중요한 것은 <strong>메모리를 굉장히 많이 차지</strong>한다는 것을 기억하면 된다는 것
<img src="https://velog.velcdn.com/images/seonyoung_3/post/1e496f07-2806-4d5f-b87c-5a9bacb55e04/image.png" alt=""></li>
<li>이에 대한 대안으로, 범주Category형 자료를 사용할 수 있음<ul>
<li>Pandas의 경우 각 데이터의 고유값을 내부에서 숫자로 치환하여 사용</li>
</ul>
</li>
<li>본래 문자열로 이루어져있던 칼럼을 범주형으로 변환</li>
<li>해당 범주 자료가 내부에서는 숫자로 사용되고 있음을 봄</li>
<li>이를 통해 90% 이상의 메모리를 절약할 수 있음</li>
</ul>
<h3 id="📁-datetime">📁 Datetime</h3>
<ul>
<li>시간과 관련된 정보</li>
<li>일반적으로 소프트웨어들은 <strong>Unix Timestamp</strong>를 기준으로 함<ul>
<li>UTC time zone을 사용</li>
<li>1970년 1월 1일 0시를 기준으로 몇 초가 경과했는지를 숫자로 표현한 것</li>
</ul>
</li>
<li>연, 월, 일 시 등의 표현은 사람마다, 소프트웨어마다, 회사마다, 팀마다 모두 다를 수 있음<ul>
<li>이러한 표현들을 일반적으로 표현하기 위한 양식 또한 존재</li>
<li>이를 통해 숫자인 Unix timestamp를 사람이 이해 가능한 문자열로 바꾸거나, 거꾸로 문자열을 Unix timestamp로 바꿀 수도 있음</li>
<li>일반적으로 년도을 <code>%y</code>나 <code>%Y</code>(4자리)로, 월을 <code>%m</code>, 일은 <code>%d</code>로 표현<pre><code class="language-python">## 21년 11월 6일 4시 30분을 파싱
dt = datetime.strptime(&quot;21/11/06 16:30&quot;, &quot;%d/%m/%y %H:%M&quot;)
dt
&gt;&gt; datetime.datetime(2006, 11, 21, 16, 30)</code></pre>
</li>
</ul>
</li>
</ul>
<h3 id="📁-time-zone">📁 Time zone</h3>
<ul>
<li><strong>시간대time zone은 시간 데이터를 다룰 때 굉장히 중요</strong>한 부분</li>
<li>특히 소프트웨어는 범국가적이기 때문에, <strong>시간의 표준화</strong>는 필수</li>
<li>일반적으로 컴퓨터 공학에서는 <strong>UTC</strong>를 기준으로 하며, Unix timestamp도 UTC를 따름</li>
<li>대부분의 Database 또한 timezone 정보를 필수로 함</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코드카타 SQL] 없어진 기록 찾기]]></title>
            <link>https://velog.io/@seonyoung_3/%EC%BD%94%EB%93%9C%EC%B9%B4%ED%83%80-SQL-%EC%97%86%EC%96%B4%EC%A7%84-%EA%B8%B0%EB%A1%9D-%EC%B0%BE%EA%B8%B0</link>
            <guid>https://velog.io/@seonyoung_3/%EC%BD%94%EB%93%9C%EC%B9%B4%ED%83%80-SQL-%EC%97%86%EC%96%B4%EC%A7%84-%EA%B8%B0%EB%A1%9D-%EC%B0%BE%EA%B8%B0</guid>
            <pubDate>Thu, 26 Sep 2024 08:54:34 GMT</pubDate>
            <description><![CDATA[<h3 id="📁-문제-설명">📁 문제 설명</h3>
<p><code>ANIMAL_INS</code> 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.
<code>ANIMAL_OUT</code> 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다. ANIMAL_OUTS 테이블의 ANIMAL_ID는 ANIMAL_INS의 ANIMAL_ID의 외래 키입니다.</p>
<h3 id="📁-문제">📁 문제</h3>
<p>천재지변으로 인해 일부 데이터가 유실되었습니다. 입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물의 ID와 이름을 ID 순으로 조회하는 SQL문을 작성해주세요.</p>
<h3 id="💡-정답">💡 정답</h3>
<pre><code class="language-sql">SELECT AO.ANIMAL_ID,AO.NAME
FROM ANIMAL_OUTS AS AO
LEFT JOIN ANIMAL_INS AS AI ON AI.ANIMAL_ID=AO.ANIMAL_ID
WHERE AO.ANIMAL_ID IS NOT NULL AND AI.ANIMAL_ID IS NULL
ORDER BY AO.ANIMAL_ID</code></pre>
<h3 id="💡-또-다른-정답">💡 또 다른 정답</h3>
<pre><code class="language-sql">SELECT ANIMAL_ID, NAME 
FROM ANIMAL_OUTS
EXCEPT
SELECT ANIMAL_ID, NAME 
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;</code></pre>
<ul>
<li><strong>ANIMAL_OUTS에서 가져온 동물 중 ANIMAL_INS에 없는 동물을 찾기 위해 EXCEPT를 사용</strong>
→ EXCEPT 연산자는 첫 번째 쿼리에서 가져온 결과에서 두 번째 쿼리의 결과를 뺀 나머지 동물, 즉 보호소에 들어온 기록이 없고 출소 기록만 있는 동물만 남음</li>
</ul>
<p>📌<code>EXCEPT</code> 연산자는 SQL에서 두 개의 쿼리 결과를 비교하여, 첫 번째 쿼리의 결과에는 포함되지만 두 번째 쿼리의 결과에는 포함되지 않는 행을 반환하는 연산자
→ 쉽게 말해, <strong>첫 번째 쿼리의 결과에서 두 번째 쿼리의 결과를 &quot;제외&quot;한 것</strong></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코드카타] - SQL 즐겨찾기가 가장 많은 식당 정보 출력하기]]></title>
            <link>https://velog.io/@seonyoung_3/%EC%BD%94%EB%93%9C%EC%B9%B4%ED%83%80-SQL-%EC%A6%90%EA%B2%A8%EC%B0%BE%EA%B8%B0%EA%B0%80-%EA%B0%80%EC%9E%A5-%EB%A7%8E%EC%9D%80-%EC%8B%9D%EB%8B%B9-%EC%A0%95%EB%B3%B4-%EC%B6%9C%EB%A0%A5%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@seonyoung_3/%EC%BD%94%EB%93%9C%EC%B9%B4%ED%83%80-SQL-%EC%A6%90%EA%B2%A8%EC%B0%BE%EA%B8%B0%EA%B0%80-%EA%B0%80%EC%9E%A5-%EB%A7%8E%EC%9D%80-%EC%8B%9D%EB%8B%B9-%EC%A0%95%EB%B3%B4-%EC%B6%9C%EB%A0%A5%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 24 Sep 2024 10:19:59 GMT</pubDate>
            <description><![CDATA[<h3 id="📁-문제-설명">📁 문제 설명</h3>
<p>다음은 식당의 정보를 담은 REST_INFO 테이블입니다. REST_INFO 테이블은 다음과 같으며 REST_ID, REST_NAME, FOOD_TYPE, VIEWS, FAVORITES, PARKING_LOT, ADDRESS, TEL은 식당 ID, 식당 이름, 음식 종류, 조회수, 즐겨찾기수, 주차장 유무, 주소, 전화번호를 의미합니다.</p>
<h3 id="📁-문제">📁 문제</h3>
<p>REST_INFO 테이블에서 음식종류별로 즐겨찾기수가 가장 많은 식당의 음식 종류, ID, 식당 이름, 즐겨찾기수를 조회하는 SQL문을 작성해주세요. 이때 결과는 음식 종류를 기준으로 내림차순 정렬해주세요.</p>
<h3 id="💡-내가-적은-오답">💡 내가 적은 오답</h3>
<pre><code class="language-sql">SELECT FOOD_TYPE, REST_ID, REST_NAME, MAX(FAVORITES) AS FAVORITES
FROM REST_INFO
GROUP BY FOOD_TYPE
ORDER BY FOOD_TYPE DESC</code></pre>
<ul>
<li>즐겨찾기수가 가장 많은 음식점을 구하라고 해서 결과도 그렇고 이 코드가 정답이 맞는 거 같은데 아무리 해봐도 오답이라고 해서 결국에 찾아보았음...</li>
</ul>
<h3 id="💡-정답">💡 정답</h3>
<pre><code class="language-sql">SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
FROM REST_INFO
WHERE (FOOD_TYPE, FAVORITES) IN (SELECT FOOD_TYPE, MAX(FAVORITES) FROM REST_INFO GROUP BY FOOD_TYPE)
GROUP BY FOOD_TYPE
ORDER BY FOOD_TYPE DESC</code></pre>
<ul>
<li>다른 사람들은 서브쿼리를 사용했으며, 결과를 비교해보니 출력값이 똑같이 나왔음</li>
<li>📌 왜 MAX는 틀렸고, 서브쿼리를 이요해야하는지 찾아보니 GROUP BY로 묶으면 가장 상단에 있는 데이터들을 임의로 가져오기 때문에 결과물이 같은 거 같지만 이는 가장 상단에 식당 정보를 가져왔던 것이 우연히 같았던 것이지 가장 즐겨찾기가 많은 식당이 아니라고 함</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코드카타 SQL] 가격대 별 상품 개수 구하기]]></title>
            <link>https://velog.io/@seonyoung_3/%EC%BD%94%EB%93%9C%EC%B9%B4%ED%83%80-SQL-%EA%B0%80%EA%B2%A9%EB%8C%80-%EB%B3%84-%EC%83%81%ED%92%88-%EA%B0%9C%EC%88%98-%EA%B5%AC%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@seonyoung_3/%EC%BD%94%EB%93%9C%EC%B9%B4%ED%83%80-SQL-%EA%B0%80%EA%B2%A9%EB%8C%80-%EB%B3%84-%EC%83%81%ED%92%88-%EA%B0%9C%EC%88%98-%EA%B5%AC%ED%95%98%EA%B8%B0</guid>
            <pubDate>Fri, 06 Sep 2024 10:52:54 GMT</pubDate>
            <description><![CDATA[<h3 id="📁-문제-설명">📁 문제 설명</h3>
<p>다음은 어느 의류 쇼핑몰에서 판매중인 상품들의 정보를 담은 <code>PRODUCT</code> 테이블입니다. <code>PRODUCT</code> 테이블은 아래와 같은 구조로 되어있으며, <code>PRODUCT_ID</code>, <code>PRODUCT_CODE</code>, <code>PRICE</code>는 각각 상품 ID, 상품코드, 판매가를 나타냅니다.
상품 별로 중복되지 않는 8자리 상품코드 값을 가지며 앞 2자리는 카테고리 코드를 나타냅니다.</p>
<h3 id="📁-문제">📁 문제</h3>
<p><code>PRODUCT</code> 테이블에서 만원 단위의 가격대 별로 상품 개수를 출력하는 SQL 문을 작성해주세요. 이때 컬럼명은 각각 컬럼명은 PRICE_GROUP, PRODUCTS로 지정해주시고 가격대 정보는 각 구간의 최소금액(10,000원 이상 ~ 20,000 미만인 구간인 경우 10,000)으로 표시해주세요. 결과는 가격대를 기준으로 오름차순 정렬해주세요.</p>
<h3 id="📁-결과-예시">📁 결과 예시</h3>
<p><img src="https://velog.velcdn.com/images/seonyoung_3/post/718af4cd-e586-490d-8088-609385245247/image.png" alt=""></p>
<h3 id="💡-내가-적은-정답">💡 내가 적은 정답</h3>
<pre><code class="language-sql">SELECT CASE WHEN PRICE &lt; 10000 THEN 0           
            WHEN PRICE &lt; 20000 THEN 10000
            WHEN PRICE &lt; 30000 THEN 20000
            WHEN PRICE &lt; 40000 THEN 30000
            WHEN PRICE &lt; 50000 THEN 40000
            WHEN PRICE &lt; 60000 THEN 50000
            WHEN PRICE &lt; 70000 THEN 60000
            WHEN PRICE &lt; 80000 THEN 70000
            WHEN PRICE &lt; 90000 THEN 80000
            ELSE 90000 END PRICE_GROUP,
            COUNT(*) AS PRODUCTS
FROM PRODUCT 
GROUP BY 1
ORDER BY 1</code></pre>
<ul>
<li>다른 쉬운 방법이 있을 것 같았지만 모르겠어서 case when 구문으로 하나 씩 다 적었다...</li>
</ul>
<h3 id="💡-또-다른-정답">💡 또 다른 정답</h3>
<pre><code class="language-sql">SELECT TRUNCATE(PRICE, -4) AS PRICE_GROUP, COUNT(*) AS PRODUCTS
FROM PRODUCT
GROUP BY 1
ORDER BY 1</code></pre>
<blockquote>
<p>📌 TRUNCATE 함수 설명</p>
</blockquote>
<ul>
<li><strong>기본 형식</strong>: <code>TRUNCATE(number, decimal_places)</code></li>
<li>number: 자르려는 원본 숫자</li>
<li>decimal_places: 소수점 이하 자릿수를 지정
→ 양수이면 소수점 이하 자릿수를 지정하고, 음수이면 소수점 위의 자릿수를 지정</li>
</ul>
<ul>
<li><code>TRUNCATE(PRICE, -4)</code>: 이 함수는 PRICE 값을 10,000 단위로 잘라서 처리</li>
<li>예를 들어, PRICE가 12,345라면 TRUNCATE(PRICE, -4)는 10,000으로 반환됨</li>
<li><code>-4</code>는 자를 위치를 천 단위로 지정하는 것</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코드카타] 문자열 바꿔서 찾기]]></title>
            <link>https://velog.io/@seonyoung_3/%EC%BD%94%EB%93%9C%EC%B9%B4%ED%83%80-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%B0%94%EA%BF%94%EC%84%9C-%EC%B0%BE%EA%B8%B0</link>
            <guid>https://velog.io/@seonyoung_3/%EC%BD%94%EB%93%9C%EC%B9%B4%ED%83%80-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%B0%94%EA%BF%94%EC%84%9C-%EC%B0%BE%EA%B8%B0</guid>
            <pubDate>Thu, 05 Sep 2024 11:19:59 GMT</pubDate>
            <description><![CDATA[<h3 id="📁-문제">📁 문제</h3>
<p>문자 &quot;A&quot;와 &quot;B&quot;로 이루어진 문자열 myString과 pat가 주어집니다. myString의 &quot;A&quot;를 &quot;B&quot;로, &quot;B&quot;를 &quot;A&quot;로 바꾼 문자열의 연속하는 부분 문자열 중 pat이 있으면 1을 아니면 0을 return 하는 solution 함수를 완성하세요.</p>
<h3 id="📁-입출력-예">📁 입출력 예</h3>
<p><img src="https://velog.velcdn.com/images/seonyoung_3/post/e2b05fdd-e8da-4f1f-826e-40226a3c6016/image.png" alt=""></p>
<h3 id="💡-내가-적은-정답">💡 내가 적은 정답</h3>
<pre><code class="language-python">def solution(myString, pat):
    swapped_string = myString.translate(str.maketrans(&#39;AB&#39;, &#39;BA&#39;))

    if pat in swapped_string:
        return 1
    else:
        return 0</code></pre>
<ul>
<li><code>str.maketrans()</code> : 문자열 변환을 위한 변환 테이블을 생성하는 함수
ㄴ 이 테이블은 두 개의 문자열을 매핑하여 각각의 문자를 다른 문자로 변환하는 데 사용됨</li>
<li><code>str.translate()</code> : <code>str.maketrans()</code>로 생성된 변환 테이블을 사용하여 문자열의 문자를 실제로 변환하는 메서드</li>
</ul>
<h3 id="💡-또-다른-정답">💡 또 다른 정답</h3>
<pre><code class="language-python">def solution(myString, pat):    
    return int(pat.replace(&#39;A&#39;, &#39;b&#39;).replace(&#39;B&#39;, &#39;a&#39;) in myString.lower())</code></pre>
<ul>
<li>엄청 짧은 정답을 발견했지만, replace 변경 문자에 왜 소문자를 넣은지와 lower()을 사용한 이유가 궁금해서 찾아보았음</li>
</ul>
<blockquote>
<h4 id="📌-궁금증에-대한-결과">📌 궁금증에 대한 결과</h4>
</blockquote>
<ul>
<li><code>replace()</code> 메서드에서 변환 문자에 <code>소문자</code>를 사용하는 이유는 변환된 문자열의 형식이 명확하고 예측 가능하게 하기 위함<ul>
<li><strong>일관성</strong>: &#39;A&#39;와 &#39;B&#39;를 서로 바꾸는 것이며, 결과적으로 소문자와 대문자를 혼합하지 않으므로 비교할 때 혼동이 없음</li>
<li><strong>가독성</strong>: &#39;a&#39;와 &#39;b&#39;를 사용함으로써 변환된 문자열이 더 읽기 쉬울 수 있으며, 대소문자 구분 없이 바뀐 문자를 명확하게 식별할 수 있음</li>
</ul>
</li>
<li><code>lower()</code> 사용 이유는 대소문자 구분없이 일관되게 비교하기 위함</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코드카타] 간단한 식 계산하기]]></title>
            <link>https://velog.io/@seonyoung_3/%EC%BD%94%EB%93%9C%EC%B9%B4%ED%83%80-%EA%B0%84%EB%8B%A8%ED%95%9C-%EC%8B%9D-%EA%B3%84%EC%82%B0%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@seonyoung_3/%EC%BD%94%EB%93%9C%EC%B9%B4%ED%83%80-%EA%B0%84%EB%8B%A8%ED%95%9C-%EC%8B%9D-%EA%B3%84%EC%82%B0%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 04 Sep 2024 11:59:37 GMT</pubDate>
            <description><![CDATA[<h3 id="📁문제">📁문제</h3>
<p>문자열 binomial이 매개변수로 주어집니다. binomial은 &quot;a op b&quot; 형태의 이항식이고 a와 b는 음이 아닌 정수, op는 &#39;+&#39;, &#39;-&#39;, &#39;*&#39; 중 하나입니다. 주어진 식을 계산한 정수를 return 하는 solution 함수를 작성해 주세요.</p>
<h3 id="📁-입출력-예">📁 입출력 예</h3>
<p><img src="https://velog.velcdn.com/images/seonyoung_3/post/6c09b2fb-c4f1-446e-9da3-93dba61916c7/image.png" alt=""></p>
<h3 id="💡-나의-정답">💡 나의 정답</h3>
<pre><code class="language-python">def solution(binomial):
    answer = 0
    a, op, b = binomial.split()
    if op == &#39;+&#39;:
        answer = int(a) + int(b)
    elif op == &#39;-&#39;:
        answer = int(a) - int(b)
    else:
        answer = int(a) * int(b)
    return answer </code></pre>
<h3 id="💡-또-다른-정답">💡 또 다른 정답</h3>
<pre><code class="language-python">def solution(binomial):
    return eval(binomial)</code></pre>
<ul>
<li>나는 하나씩 모두 입력해서 정답을 도출했는데 <code>eval</code>하나만 넣고 돌리면 바로 정답이 나올 줄이야..😂 </li>
<li>역시 python은 방법이 정말 다양하다는 것을 깨달았음</li>
</ul>
<blockquote>
<p>📌 <code>eval 함수</code> : 문자열 형태의 파이썬 표현식을 실행하고 그 결과를 반환
결국, 이 함수는 binomial이라는 문자열 수식을 파이썬 코드로 평가하여 계산 결과를 돌려줌
ㄴ ex) binomial이 &quot;3 + 5&quot;라면, eval(&quot;3 + 5&quot;)는 8을 반환
      binomial이 &quot;10 / 2&quot;라면, eval(&quot;10 / 2&quot;)는 5.0을 반환</p>
</blockquote>
<p>✅ <strong>주의할 점</strong> : <code>eval 함수</code>는 주어진 문자열이 임의의 코드 실행을 가능하게 하므로, <strong>신뢰할 수 없는 입력에 대해 사용하지 않는 것이 좋음</strong></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[머신러닝] 딥러닝]]></title>
            <link>https://velog.io/@seonyoung_3/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EB%94%A5%EB%9F%AC%EB%8B%9D</link>
            <guid>https://velog.io/@seonyoung_3/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EB%94%A5%EB%9F%AC%EB%8B%9D</guid>
            <pubDate>Tue, 03 Sep 2024 10:29:11 GMT</pubDate>
            <description><![CDATA[<h3 id="📁-딥러닝">📁 딥러닝</h3>
<h4 id="머신러닝-vs-딥러닝">&lt;머신러닝 vs 딥러닝&gt;</h4>
<ul>
<li>머신러닝과 딥러닝은 내부 구조와 활용범위가 다를 뿐 기본적인 흐름은 같음</li>
<li>다만 딥러닝은 자연어처리와 이미지 처리에 뛰어난 발전을 이룸
<img src="https://velog.velcdn.com/images/seonyoung_3/post/3bae08fc-37af-4050-9f93-8c62188c5509/image.png" alt=""></li>
<li><strong>공통점</strong> : 데이터로부터 가중치를 학습하여 패턴을 인식하고 결정을 내리는 알고리즘 개발과 관련된 인공지능(AI)의 하위 분야</li>
<li><strong>차이점</strong><ul>
<li><code>머신러닝</code> : 데이터 안의 통계적 관계를 찾아내며 예측이나 부류를 하는 방법</li>
<li><code>딥러닝</code> : 머신러닝의 한 분야로 신경세포 구조를 모방한 인공 신경망을 사용함</li>
</ul>
</li>
</ul>
<h4 id="딥러닝의-유래">&lt;딥러닝의 유래&gt;</h4>
<ul>
<li><code>인공 신경망(Artificial Neural Networks)</code><ul>
<li>인간의 신경세포를 모방하여 만든 망(Networks)</li>
</ul>
</li>
<li><code>신경세포</code> : 이전 신경세포로 들어오는 자극을 이후 신경세포로 전기신호로 전달하는 기능을 하는 세포</li>
<li><code>퍼셉트론(Perceptron)</code> : 인공 신경망의 가장 작은 단위 </li>
<li><strong>선형회귀식</strong></li>
</ul>
<p>$$
\hat{Y} = w_0 + w_1X
$$</p>
<p>$$
Y = w_0 + w_1X +b
$$</p>
<ul>
<li>몸무게와 키 데이터<ul>
<li>Y: 키</li>
<li>X: 몸무게</li>
<li>$w_0$: 100 로 임의로 설정</li>
<li>$w_1$: 1 로 임의로 설정</li>
<li>b(편향, bias): 실제 Y값 - 예측 Y</li>
</ul>
</li>
<li>키-몸무게 데이터에 대한 퍼셉트론
<img src="https://velog.velcdn.com/images/seonyoung_3/post/0e84ca66-c3e9-4caf-9813-97dfb0989107/image.png" alt=""></li>
</ul>
<h4 id="가중치-구하기---gradient-descent">&lt;가중치 구하기 - Gradient Descent&gt;</h4>
<p>ex)</p>
<ul>
<li>늦은 밤 산을 하산하는 가장 쉬운 방법은?<ul>
<li>A) 밑으로 밑으로 향하면 됨
<img src="https://velog.velcdn.com/images/seonyoung_3/post/95d02d69-dd49-4b35-8ef5-4e41a4401c25/image.png" alt=""></li>
</ul>
</li>
<li>회귀 문제에서 최소화 하려는 값은?<ul>
<li>Mean Squared Error(MSE): 에러을 제곱한 총합의 평균</li>
<li>즉, 가중치(weight)를 이리 저리 움직이면서 <strong>최소의 MSE를 도출</strong><ul>
<li>이렇게 최소화하려는 값을 <strong>목적 함수</strong> 혹은 <strong>손실 함수(cost function)</strong>이라고 명명
<img src="https://velog.velcdn.com/images/seonyoung_3/post/de553d28-085f-464c-8c22-6d0ef386818d/image.png" alt="">
→ 📌 경사 하강법(Gradient Descent) : 모델의 손실 함수를 최소화하기 위해 모델의 가중치를 반복적으로 조정하는 최적화 알고리즘(weight를 찾기 위한 직관적이고 빠른 계산 방법)
→ 변수 X가 여러 개 있다면 동시에 여러 개의 값을 조정하면서 최소의 값을 찾으면 됨</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="활성화-함수">&lt;활성화 함수&gt;</h4>
<ul>
<li>타이타닉 문제에서 사망, 생존과 같은 비선형적분류를 만들기 위해 <code>활성화 함수(Acitvation Fucntion)</code>을 사용하게 됨 </li>
<li>로지스틱회귀 때 배웠던 로지스틱 함수 역시 활성화 함수의 한 예</li>
</ul>
<h4 id="히든-레이어의-등장">&lt;히든 레이어의 등장&gt;</h4>
<ul>
<li>데이터를 비선형적으로 변환함과 동시에 데이터의 고차원적 특성(ex 이미지, 자연어)을 학습하기 위해 중간에 입력과 결과 외의 추가하게 되는 <strong>숨은 층(Hidden Layer)</strong>의 개념이 등장
<img src="https://velog.velcdn.com/images/seonyoung_3/post/fe9ed633-6d4d-48b0-a547-60aa377f4752/image.png" alt="">
→ 📌 하지만, 히든 레이어를 추가할 수록 더 좋은 모델이 나올 줄 알았으나, 실제로는 기울기 소실이라는 문제가 발생(그 이유는 인공 신경망의 학습 과정에 있음)</li>
<li>인공 신경망의 학습<ul>
<li>입력 데이터가 신경망의 각 층을 통과하면서 최종 출력까지 생성되는 과정을 <code>순전파(Propagation)</code></li>
<li>신경망의 오류를 역방향으로 전파하여 각 층의 가중치를 조절하는 과정을 <code>역전파(Backpropagation)</code></li>
</ul>
</li>
<li>기울기 소실 문제 등장<ul>
<li>문제 : 역전파 과정에서 하위 레이어로 갈수록 오차의 기울기가 점점 작아져 가중치가 거의 업데이트 되지 않는 현상</li>
<li>해결 : 특정 활성화 함수(ex Relu)를 통해 완화 하게 됨
<img src="https://velog.velcdn.com/images/seonyoung_3/post/5d4c4eac-c59f-4e73-9b3c-7140d6e9753f/image.png" alt=""></li>
</ul>
</li>
<li>각 명칭에 대한 정리<ul>
<li><code>Input Layer</code> : 주어진 데이터가 벡터(Vector)의 형태로 입력됨</li>
<li><code>Hidden Layer</code> : Input Layer와 Output Layer를 매개하는 레이어로 이를 통해 비선형 문제를 해결할 수 있게 됨</li>
<li><code>Output Layer</code> : 최종적으로 도착하게 되는 Layer<ul>
<li><strong>Activation function(활성화 함수)</strong> : 인공신경망의 비선형성을 추가하며 기울기 소실 문제 해결함</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="딥러닝의-복습">&lt;딥러닝의 복습&gt;</h4>
<ul>
<li>딥러닝에서 동일한 데이터에 대해서 여러 번 공부 할 수 있음</li>
<li><code>epoch</code> : 전체 데이터가 신경망을 통과하는 한 번의 사이클<ul>
<li>1000 epoch : 데이터 전체를 1000번 학습</li>
</ul>
</li>
<li><code>batch</code> : 전체 훈련 데이터 셋을 일정한 크기의 소 그룹으로 나눈 것</li>
<li><code>iteration</code> : 전체 훈련 데이터 셋을 여러 개(=batch)로 나누었을 때 배치가 학습되는 횟수
<img src="https://velog.velcdn.com/images/seonyoung_3/post/e55b7ed4-873b-43f2-8c94-e48601be2334/image.png" alt="">
ex) 1000개의 데이터 batch size 100개라면,  1 epoch에는 iteration은 10번 일어나며 가중치 업데이트도 10번 진행</li>
</ul>
<h3 id="📁-tensorflow-패키지">📁 Tensorflow 패키지</h3>
<ul>
<li><code>tensorflow.keras.model.Sequential</code><ul>
<li><code>model.add</code>: 모델에 대한 새로운 층을 추가함<ul>
<li><code>unit</code></li>
</ul>
</li>
<li><code>model.compile</code>: 모델 구조를 컴파일하며 학습 과정을 설정<ul>
<li><code>optimizer</code> : 최적화 방법, Gradient Descent 종류 선택</li>
<li><code>loss</code> : 학습 중 손실 함수 설정<ul>
<li>회귀: mean_squared_error(회귀)</li>
<li>분류: categorical_crossentropy</li>
</ul>
</li>
<li><code>metrics</code> : 평가척도<ul>
<li><code>mse</code>: Mean Squared Error</li>
<li><code>acc</code> : 정확도</li>
<li><code>f1_score</code>: f1 score</li>
</ul>
</li>
</ul>
</li>
<li><code>model.fit</code>: 모델을 훈련 시키는 과정<ul>
<li><code>epochs</code>: 전체 훈련 데이터 셋에 대해 학습을 반복하는 횟수</li>
</ul>
</li>
<li><code>model.summary()</code>:  모델의 구조를 요약하여 출력</li>
</ul>
</li>
<li><code>tensorflow.keras.model.Dense</code>: 완전 연결된 층<ul>
<li><code>unit</code>: 층에 있는 유닛의 수. 출력에 대한 차원 개수</li>
<li><code>input_shape</code>:1번째 층에만 필요하면 입력데이터의 형태를 지정</li>
</ul>
</li>
<li><code>model.evaluate</code>: 테스트 데이터를 사용하여 평가</li>
<li><code>model.predict</code>: 새로운 데이터에 대해서 예측 수행</li>
</ul>
<h3 id="📁-딥러닝의-활용-예시">📁 딥러닝의 활용 예시</h3>
<h4 id="자연어처리가장-간단">&lt;자연어처리(가장 간단)&gt;</h4>
<ul>
<li><strong>인간의 언어를 데이터 화</strong> 하는 것</li>
<li>ex) 단어의 빈도 수 기반 데이터 화(Bag of Words)
<img src="https://velog.velcdn.com/images/seonyoung_3/post/e611be55-7729-4117-a5ee-46d11121a493/image.png" alt=""></li>
</ul>
<h3 id="📁-딥러닝-이미지-예시">📁 딥러닝 이미지 예시</h3>
<ul>
<li>이미지는 색깔이 이미 데이터이기 때문에 합성 곱 연산을 통해 딥러닝 모델에 학습하고 이미지를 생성하는 방식으로 발전</li>
</ul>
<h4 id="이미지는-원래-데이터-기반">&lt;이미지는 원래 데이터 기반&gt;</h4>
<ul>
<li>이미지도 RGB 256개의 데이터로 이루어진 데이터의 집합</li>
<li>3차원 데이터를 모델에 학습 시킴
ex) 숫자 2를 예측하는 딥러닝의 구조
<img src="https://velog.velcdn.com/images/seonyoung_3/post/d9cdb5ce-e72d-44a3-bc5a-9c2d31cd5c0a/image.png" alt="">
ex) 합성 곱(CNN) 연산의 예시
<img src="https://velog.velcdn.com/images/seonyoung_3/post/b518399e-ef39-4b8d-9111-fc85efc58ec9/image.png" alt=""></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코드카타] 원하는 문자열 찾기]]></title>
            <link>https://velog.io/@seonyoung_3/%EC%BD%94%EB%93%9C%EC%B9%B4%ED%83%80-%EC%9B%90%ED%95%98%EB%8A%94-%EB%AC%B8%EC%9E%90%EC%97%B4-%EC%B0%BE%EA%B8%B0</link>
            <guid>https://velog.io/@seonyoung_3/%EC%BD%94%EB%93%9C%EC%B9%B4%ED%83%80-%EC%9B%90%ED%95%98%EB%8A%94-%EB%AC%B8%EC%9E%90%EC%97%B4-%EC%B0%BE%EA%B8%B0</guid>
            <pubDate>Mon, 02 Sep 2024 11:06:01 GMT</pubDate>
            <description><![CDATA[<h3 id="📁-문제">📁 문제</h3>
<p>알파벳으로 이루어진 문자열 myString과 pat이 주어집니다. myString의 연속된 부분 문자열 중 pat이 존재하면 1을 그렇지 않으면 0을 return 하는 solution 함수를 완성해 주세요.</p>
<p>단, 알파벳 대문자와 소문자는 구분하지 않습니다.</p>
<h3 id="📁-입출력-예">📁 입출력 예</h3>
<p><img src="https://velog.velcdn.com/images/seonyoung_3/post/0527fe6b-ce62-4a1e-b5c6-a8cb6834e7ce/image.png" alt=""></p>
<h3 id="💡-내가-적은-오답1">💡 내가 적은 오답(1)</h3>
<pre><code class="language-python">def solution(myString, pat):
    answer = 0

    for i in myString:
        if i == pat:
            answer = 1
        else: 
            answer = 0
    return answe</code></pre>
<p><img src="https://velog.velcdn.com/images/seonyoung_3/post/dfba17e3-db1a-4cc6-bedc-8114fca694d7/image.png" alt=""></p>
<h3 id="💡-내가-적은-오답2">💡 내가 적은 오답(2)</h3>
<pre><code class="language-python">def solution(myString, pat):
    if pat in myString:
        return 1
    else:
        return 0</code></pre>
<p><img src="https://velog.velcdn.com/images/seonyoung_3/post/62cfff7c-3040-4a26-bc3a-c31d6811b570/image.png" alt=""></p>
<ul>
<li>myString 안에 pat이 존재하는지 확인하기 위해선 for문을 이용해야할줄 알았는데 문자열 내에서 특정 패턴이 존재하는지 확인하는 작업은 문자열의 포함 여부를 확인하는 것이라 필요 없다는 것을 깨닫고 바꾸었음(python의 in연산자를 활용할 수 있음)</li>
<li>그러나 또 오답...</li>
</ul>
<h3 id="💡-내가-적은-정답">💡 내가 적은 정답</h3>
<pre><code class="language-python">def solution(myString, pat):
    myString = myString.lower() # 문자열을 소문자로 변환하여 대소문자 구분을 없앰
    pat = pat.lower()

    if pat in myString:
        return 1
    else:
        return 0</code></pre>
<blockquote>
<h4 id="📌-대소문자-구분을-없애는-이유">📌 대소문자 구분을 없애는 이유</h4>
</blockquote>
<ul>
<li>문자열 검색시 일관성과 정확성을 높이기 위해 대소문자 구분을 없애는게 필요함<ul>
<li>사용자의 편의성</li>
<li>문제의 명확성</li>
<li>검색 효율성 </li>
<li>정확한 매칭
→ 즉, 사용자 입력의 다양한 형태를 처리하고, 검색 결과의 일관성을 보장하며, 알고리즘을 단순화하기 위해서 필요함</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[머신러닝] 비지도 학습]]></title>
            <link>https://velog.io/@seonyoung_3/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EB%B9%84%EC%A7%80%EB%8F%84-%ED%95%99%EC%8A%B5</link>
            <guid>https://velog.io/@seonyoung_3/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EB%B9%84%EC%A7%80%EB%8F%84-%ED%95%99%EC%8A%B5</guid>
            <pubDate>Fri, 23 Aug 2024 04:29:39 GMT</pubDate>
            <description><![CDATA[<h3 id="📁-붓꽃-데이터를-이용한-군집화">📁 붓꽃 데이터를 이용한 군집화</h3>
<ul>
<li>K - 평균 군집화 혹은 알고리즘(K-means clustering) : 가장 일반적으로 사용되는 알고리즘<ul>
<li>sepal_length: 꽃 받침의 길이</li>
<li>sepal_width: 꽃 받침의 너비</li>
<li>petal_length: 꽃 잎의 길이</li>
<li>petal_width 꽃 잎의 너비</li>
<li>species(Y, 레이블): 붓꽃 종(setosa, virginica, versicolor)</li>
</ul>
</li>
<li>Labeling이 안된 꽃 받침 <code>길이-너비</code> 산점도
<img src="https://velog.velcdn.com/images/seonyoung_3/post/ebb47024-57c7-4880-b5a6-6ac245be8d2d/image.png" alt=""></li>
<li>위의 점들을 3개로 그룹화
<img src="https://velog.velcdn.com/images/seonyoung_3/post/55cae0d0-507d-41ee-a543-4e1f176adccb/image.png" alt="">
→ “데이터”의 기준으로 보면 3개가 아닌 K개의 그룹으로 정해볼 수 있음</li>
</ul>
<h3 id="📁-k-means-clustering">📁 K-Means Clustering</h3>
<h4 id="수행순서">&lt;수행순서&gt;</h4>
<p><img src="https://velog.velcdn.com/images/seonyoung_3/post/1834c4e3-8af4-4bd9-96be-51e381981d65/image.png" alt=""></p>
<ol>
<li>K개 군집 수 설정</li>
<li>임의의 중심을 선정</li>
<li>해당 중심점과 거리가 가까운 데이터를 그룹화
<img src="https://velog.velcdn.com/images/seonyoung_3/post/21857d7b-5c04-46eb-bdd9-bfab00543f50/image.png" alt=""></li>
<li>데이터의 그룹의 무게 중심으로 중심점을 이동</li>
<li>중심점을 이동했기 때문에 다시 거리가 가까운 데이터를 그룹화 (3~5번 반복)
→ 📌 이렇게 <strong>임의로 선정한 K군집수</strong>를 기준으로 데이터 군집화 프로세스를 진행</li>
</ol>
<ul>
<li>장점<ul>
<li>일반적이고 적용하기 쉬움</li>
</ul>
</li>
<li>단점<ul>
<li>거리 기반으로 가까움을 측정하기 때문에 차원이 많을 수록 정확도가 떨어짐</li>
<li>반복 횟수가 많을 수록 시간이 느려짐</li>
<li>몇 개의 군집(K)을 선정할지 주관적임</li>
<li>평균을 이용하기 때문에(중심점) 이상치에 취약함</li>
</ul>
</li>
<li>Python 라이브러리<ul>
<li><code>sklearn.cluster.KMeans</code><ul>
<li>함수 입력 값<ul>
<li><code>n_cluster</code>: 군집화 갯수</li>
<li><code>max_iter</code>: 최대 반복 횟수</li>
</ul>
</li>
<li>메소드<ul>
<li><code>labels_</code>: 각 데이터 포인트가 속한 군집 중심점 레이블</li>
<li><code>cluster_centers</code>: 각 군집 중심점의 좌표</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="📁-군집평가-지표">📁 군집평가 지표</h3>
<h4 id="실루엣-계수">&lt;실루엣 계수&gt;</h4>
<ul>
<li><p>비지도 학습 특성 상 답이 없이 때문에 그 평가를 하긴 쉽지 않음</p>
</li>
<li><p>군집화가 잘되어 있다는 것은 다른 군집간의 거리는 떨어져 있고 동일한 군집끼리는 가까이 있다는 것을 의미
<img src="https://velog.velcdn.com/images/seonyoung_3/post/5261c028-e46e-4b7d-8e32-1b145854f41a/image.png" alt="">
→ 📌 <code>실루엣 분석(silhouette analysis)</code> : 간 군집 간의 거리가 얼마나 효율적으로 분리되어 있는지 측정</p>
</li>
<li><p>실루엣 계수</p>
<ul>
<li><p>수식:</p>
<p>  $$
  S(i) = \frac{b(i)-a(i)}{max(a(i),b(i))} \ 단\ i는 데이터
  $$</p>
<ul>
<li>$a(i)$ : 데이터 포인트 $i$ 과 같은 군집에 속한 다른 포인트들과의 평균 거리</li>
<li>$b(i)$ : 데이터 포인트 $i$ 와 가장 가까운 다른 군집 간의 평균 거리</li>
</ul>
</li>
<li><p>해석 : 1로 갈수록 잘 군집화 되어 있음 / 1에 가까울수록 잘 못 군집화 되어 있음</p>
</li>
</ul>
</li>
</ul>
<p>→ 📌특정한 데이터 <strong>i의 실루엣 계수</strong>는  얼마나 떨어져있는가<code>($b(i) -a(i)$)</code>가 클 수록 크며, 이를 단위 정규화를 위해 <code>$a(i), b(i)$</code> 값 중에 큰 값으로 나눔</p>
<ul>
<li>좋은 군집화의 조건<ul>
<li>실루엣 값이 높을수록(1에 가까움)</li>
<li>개별 군집의 평균 값의 편차가 크지 않아야 함</li>
</ul>
</li>
<li>Python 라이브러리<ul>
<li><code>sklearn.metrics.sihouette_score</code>: 전제 데이터의 실루엣 계수 평균 값 반환<ul>
<li>함수 입력 값<ul>
<li><code>X</code>: 데이터 세트</li>
<li><code>labels</code>: 레이블</li>
<li><code>metrics</code>: 측정 기준 기본은 <code>euclidean</code></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="📁-고객-세그멘테이션">📁 고객 세그멘테이션</h3>
<ul>
<li><code>이중 고객 세그멘테이션(Customer Segmentation)</code> : 다양한 기준으로 고객을 분류하는 기법</li>
<li>주로 타겟 마케팅이라 불리는 고객 특서엥 맞게 세분화 하여 유형에 따라 맞춤형 마게팅이나 서비스를 제공하는 것을 목표로 둠
<img src="https://velog.velcdn.com/images/seonyoung_3/post/7350b3e1-e445-4fa7-a19b-6eda762ef783/image.png" alt=""></li>
<li>RFM의 개념<ul>
<li><code>Recency(R)</code> : 가장 최근 구입 일에서 오늘까지의 시간</li>
<li><code>Frequency(F)</code> : 상품 구매 횟수</li>
<li><code>Monetary value(M)</code> : 총 구매 금액</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[머신러닝] 회귀, 분류 모델링]]></title>
            <link>https://velog.io/@seonyoung_3/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%ED%9A%8C%EA%B7%80-%EB%B6%84%EB%A5%98-%EB%AA%A8%EB%8D%B8%EB%A7%81</link>
            <guid>https://velog.io/@seonyoung_3/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%ED%9A%8C%EA%B7%80-%EB%B6%84%EB%A5%98-%EB%AA%A8%EB%8D%B8%EB%A7%81</guid>
            <pubDate>Fri, 23 Aug 2024 02:44:52 GMT</pubDate>
            <description><![CDATA[<h3 id="📁-의사결정나무decision-tree-dt">📁 의사결정나무(Decision Tree, DT)</h3>
<ul>
<li>의사결정규칙을 나무 구조로 나타내어 전체 자료를 <strong>몇 개의 소집단으로 분류하거나 예측을 수행</strong>하는 분석 방법</li>
<li>타이타닉의 예시<ul>
<li>성별의 기준으로 의사결정나무 시각화
<img src="https://velog.velcdn.com/images/seonyoung_3/post/34435d8a-9f4b-4faf-8f0b-250d7028daa9/image.png" alt=""></li>
</ul>
</li>
<li>결정 트리의 과정
<img src="https://velog.velcdn.com/images/seonyoung_3/post/fe0d6e75-841f-4d4e-b8fd-652ec82afd0e/image.png" alt="">
→ 출처 : <a href="https://eehoeskrap.tistory.com/12">https://eehoeskrap.tistory.com/12</a></li>
<li>명칭<ul>
<li><code>루트 노드(Root Node)</code> : 의사결정나무의 시작점 / 최초의 분할조건</li>
<li><code>리프 노드(Leaf Node)</code> : 루트 노드로부터 파생된 중간 혹은 최종 노드</li>
<li><code>분류기준(criteria)</code> : sex는 여성인 경우 0, 남성인 경우 1로 인코딩. 여성인 경우 좌측 노드로, 남성인 경우 우측 노드로 분류</li>
<li><code>불순도(impurity)</code><ul>
<li>불순도 측정 방법 중 하나 인 지니 계수는 0과 1사이 값으로 0이 완벽한 순도(모든 샘플이 하나의 클래스), 1은 완전한 불순도(노드의 샘플의 균등하게 분포) 됨을 나타냄</li>
<li>리프 노드로 갈수록 불순도가 작아지는(한쪽으로 클래스가 분류가 잘되는)방향으로 나무가 자람</li>
</ul>
</li>
<li><code>샘플(samples)</code> : 해당 노드의 샘플 개수(891개의 관측치)</li>
<li><code>값(value)</code> : Y변수에 대한 배열 / 549명이 죽었고(Y = 0), 342명이 살았음(Y = 1)</li>
<li><code>클래스(class)</code><ul>
<li>가장 많은 샘플을 차지하는 클래스를 표현</li>
<li>위에서는 주황색(Y = 0 다수), 파란색(Y=1 다수)를 표현</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="의사결정나무-정리">&lt;의사결정나무 정리&gt;</h4>
<ul>
<li>장점<ul>
<li>쉽고 해석하기 용이</li>
<li>다중분류와 회귀에 <strong>모두 적용이 가능</strong></li>
<li>이상치에 견고하며 데이터 <strong>스케일링이 불필요</strong>(데이터의 상대적인 순서를 고려해서)</li>
</ul>
</li>
<li>단점<ul>
<li>나무가 성장을 너무 많이하면 과대 적합의 오류에 빠질 수 있다.</li>
<li>훈련 데이터에 민감하게 반응하여 작은 변화가 노이즈에도 나무의 구조가 크게 달라짐<strong>(불안정성)</strong></li>
</ul>
</li>
<li>Python 라이브러리<ul>
<li><code>sklearn.tree.DecisionTreeClassifier</code></li>
<li><code>sklearn.tree.DecisionTreeRegressor</code></li>
</ul>
</li>
</ul>
<h3 id="📁-랜덤-포레스트-이론">📁 랜덤 포레스트 이론</h3>
<ul>
<li>의사결정 나무는 과적합과 불안정성 대한 문제가 대두</li>
<li>이를 해결하기 위한 아이디어는 바로 나무(tree)를 여러 개 만들어 <strong>숲(Forest)를 만드는 것</strong></li>
</ul>
<h4 id="배깅bagging의-원리">&lt;배깅(Bagging)의 원리&gt;</h4>
<ul>
<li>언제나 머신러닝은 데이터의 부족이 문제</li>
<li>이를 해결 하기 위한 <code>Bootstrapping + Aggregating</code> 방법론<ul>
<li><code>Bootstrapping</code> : 데이터를 복원 추출해서 유사하지만 다른 데이터 집단을 생성하는 것</li>
<li><code>Aggregating</code> : 데이터의 예측,분류 결과를 합치는 것</li>
<li><code>Ensemble(앙상블)</code> : 여러 개의 모델을 만들어 결과를 합치는 것
<img src="https://velog.velcdn.com/images/seonyoung_3/post/78dfd0cb-db1e-4b5e-80a8-bd9a705043cf/image.png" alt=""></li>
</ul>
</li>
<li>Bootstrap은 “자기 스스로 해낸다”의 뜻의 유래를 가지고 있고, 영단어로는 부츠 신발의 끈을 의미</li>
<li>이를 차용하여 데이터를 복원추출한다는 것을 뜻</li>
<li>이렇게 생성된 데이터 샘플들은 모집단의 분포를 유사하게 따라가고 있어 다양성을 보장하면서 데이터의 부족 이슈를 해결하게 됨</li>
</ul>
<h4 id="tree를-forest로-만들기">&lt;Tree를 Forest로 만들기&gt;</h4>
<ul>
<li>여러 개의 데이터 샘플에서 각자 의사결정트리를 만들어서 다수결 법칙에 따라 결론을 냄<ul>
<li>ex) 1번 승객에 대해서 모델 2개는 생존, 모델 1개는 사망을 분류하였다면, 1번 승객은 최종적으로 생존으로 분류
<img src="https://velog.velcdn.com/images/seonyoung_3/post/46b2c1cd-9f5f-4ba0-92ed-12faec4c3d6e/image.png" alt="">
→ 📌 의사결정나무의 장점은 수용하고 단점은 보완하여, 랜덤 포레스트는 일반적으로 굉장히 뛰어난 성능을 보여서 지금도 자주 쓰이는 알고리즘</li>
</ul>
</li>
</ul>
<h4 id="랜덤-포레스트-정리">&lt;랜덤 포레스트 정리&gt;</h4>
<ul>
<li><strong>장점</strong><ul>
<li>Bagging 과정을 통해 과적합을 피할 수 있음</li>
<li>이상치에 견고하며 데이터 스케일링이 불필요</li>
<li>변수 중요도를 추출하여 모델 해석에 중요한 특징을 파악 할 수 있음</li>
</ul>
</li>
<li><strong>단점</strong><ul>
<li>컴퓨터 리소스 비용이 큼</li>
<li>앙상블 적용으로 해석이 어려움</li>
</ul>
</li>
<li>Python 패키지<ul>
<li><code>sklearn.ensemble.RandomForestClassifer</code></li>
<li><code>sklearn.ensemble.RandomForestRegressor</code></li>
</ul>
</li>
</ul>
<h3 id="📁-최근접-이웃">📁 최근접 이웃</h3>
<ul>
<li><code>K-Nearest Neighbor(KNN, KNN)</code> : 주변의 데이터를 보고 내가 알고 싶은 데이터를 예측하는 방식
<img src="https://velog.velcdn.com/images/seonyoung_3/post/c257b913-197e-41e7-b815-3c476f55668d/image.png" alt=""></li>
<li>K=3이라면 별 1개와 세모 2개이므로 ? 는 세모로 예측될 것</li>
<li>K=7이라면 별 4개와 세모 3개이므로 ?는 별로 예측될 것
→ 📌 <code>KNN의 기본 원리</code> : 확인할 주변 데이터 K개를 선정 후에 거리 기준으로 가장 많은 것으로 예측하는 것</li>
</ul>
<h4 id="하이퍼-파라미터의-개념">&lt;하이퍼 파라미터의 개념&gt;</h4>
<ul>
<li><code>파라미터(Parameter)</code> : 머신러닝 모델이 학습 과정에서 추정하는 내부 변수이며 자동으로 결정 되는 값<ul>
<li>Ex) 선형회귀에서 가중치와 편향</li>
<li>(혼동주의) Python에서는 함수 정의에서 함수가 받을 수 있는 인자(입력 값)를 지정하는 개념</li>
</ul>
</li>
<li><code>하이퍼 파라미터(Hyper parameter)</code> : 데이터 과학자가 기계 학습 모델 훈련을 관리하는데 사용하는 외부 구성변수이며 모델 학습과정이나 구조에 영향을 미침</li>
</ul>
<h4 id="거리의-개념">&lt;거리의 개념&gt;</h4>
<ul>
<li><code>유클리드 거리(Euclidean Distance)</code> : 두 점의 좌표가 주어지면 피타고라스의 정리로 거리를 구할 수 있는 것</li>
<li>유클리드 거리 공식:
<img src="https://velog.velcdn.com/images/seonyoung_3/post/acd554cc-cfb9-4349-8d2b-cc0696b1966f/image.png" alt=""></li>
<li>표준화는 필수</li>
</ul>
<h4 id="knn-모델의-정리">&lt;KNN 모델의 정리&gt;</h4>
<ul>
<li><strong>장점</strong><ul>
<li>이해하기 쉽고 직관적</li>
<li>모집단의 가정이나 형태를 고려하지 않음</li>
<li>회귀, 분류 모두 가능함</li>
</ul>
</li>
<li><strong>단점</strong><ul>
<li>차원 수가 많을 수록 계산량이 많아짐</li>
<li>거리 기반의 알고리즘이기 때문에 피처의 표준화가 필요함</li>
</ul>
</li>
<li>Python 라이브러리<ul>
<li><code>sklearn.neighbors.KNeighborsClassifier</code></li>
<li><code>sklearn.neighbors.KNeighborsRegressor</code></li>
</ul>
</li>
</ul>
<h3 id="📁-부스팅-알고리즘">📁 부스팅 알고리즘</h3>
<ul>
<li><strong>부스팅(Boosting) 알고리즘</strong> : 여러 개의 약한 학습기(weak learner)를 순차적으로 학습하면서 잘못 예측한 데이터에 가중치를 부여하여 오류를 개선해나가는 학습 방식
<img src="https://velog.velcdn.com/images/seonyoung_3/post/098adee0-0e49-4684-8772-943dcaad50d1/image.png" alt=""></li>
<li>빨간색과 초록색을 분류하는 문제의 경우 1개의 선(learner)으로 구별되지 않는 경우가 있음</li>
<li>이를 통해 여러 개의 learner를 합친 ensemble을 통해 성능을 올리는 방법</li>
<li>부스팅 알고리즘 종류<ul>
<li><code>Gradient Boosting Model</code><ul>
<li>특징<ul>
<li>가중치 업데이트를 경사하강법 방법을 통해 진행</li>
</ul>
</li>
<li>Python 라이브러리<ul>
<li><code>sklearn.ensemble.GradientBoostingClassifier</code></li>
<li><code>sklearn.ensemble.GradientBoostingRegressor</code></li>
</ul>
</li>
</ul>
</li>
<li><code>XGBoost</code><ul>
<li>특징<ul>
<li>트리기반 앙상블 기법으로, 가장 각광받으며 Kaggle의 상위 알고리즘</li>
<li>병렬학습이 가능해 속도가 빠름</li>
</ul>
</li>
<li>Python 라이브러리<ul>
<li><code>xgboost.XGBRegressor</code></li>
<li><code>xgboost.XGBRegressor</code></li>
</ul>
</li>
</ul>
</li>
<li><code>LightGBM</code><ul>
<li>특징<ul>
<li>XGBoost와 함께 가장 각광받는 알고리즘</li>
<li>XGBoost보다 학습시간이 짧고 메모리 사용량이 작음</li>
<li>작은 데이터(10,000건 이하)의 경우 과적합 발생</li>
</ul>
</li>
<li>Python 라이브러리<ul>
<li><code>lightgbm.LGBMClassifier</code></li>
<li><code>lightgbm.LGBMRegressor</code></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코드카타] 길이에 따른 연산]]></title>
            <link>https://velog.io/@seonyoung_3/%EC%BD%94%EB%93%9C%EC%B9%B4%ED%83%80-%EA%B8%B8%EC%9D%B4%EC%97%90-%EB%94%B0%EB%A5%B8-%EC%97%B0%EC%82%B0</link>
            <guid>https://velog.io/@seonyoung_3/%EC%BD%94%EB%93%9C%EC%B9%B4%ED%83%80-%EA%B8%B8%EC%9D%B4%EC%97%90-%EB%94%B0%EB%A5%B8-%EC%97%B0%EC%82%B0</guid>
            <pubDate>Thu, 22 Aug 2024 06:03:37 GMT</pubDate>
            <description><![CDATA[<h3 id="📁-문제">📁 문제</h3>
<p>정수가 담긴 리스트 num_list가 주어질 때, 리스트의 길이가 11 이상이면 리스트에 있는 모든 원소의 합을 10 이하이면 모든 원소의 곱을 return하도록 solution 함수를 완성해주세요.</p>
<h3 id="📁-입출력-예">📁 입출력 예</h3>
<p><img src="https://velog.velcdn.com/images/seonyoung_3/post/abfebcf5-58c8-49dd-9136-0af9ac2a9a38/image.png" alt=""></p>
<h3 id="💡-나의-오답">💡 나의 오답</h3>
<pre><code class="language-python">def solution(num_list):
    answer = 0

    if len(num_list) &gt;= 11:
        for i in num_list:
            answer += i
    else: 
        for i in num_list:
            answer *= i
    return answer</code></pre>
<p><img src="https://velog.velcdn.com/images/seonyoung_3/post/b21d779d-aaac-4d6d-8f9a-64dbe47be627/image.png" alt=""></p>
<ul>
<li>if에서 리스트의 길이 11 이상일 때 리스트에 있는 모든 원소들의 합</li>
<li>else에서 10이하면 모든 원소들의 곱을 return하는 코드를 작성함
→ 그러나 첫 번째 테스트만 통과하고 두 번째 테스트는 실패...
→ 무언가 더 추가해야 하는 건가 싶어서 더 시도를 해보았음</li>
</ul>
<h3 id="💡-나의-정답">💡 나의 정답</h3>
<pre><code class="language-python">def solution(num_list):
    answer = 0

    if len(num_list) &gt;= 11:
        for i in num_list:
            answer += i
    else: 
        answer = 1  
        for i in num_list:
            answer *= i
    return answer</code></pre>
<ul>
<li>뭐가 문제인지 모르겠어서 인터넷에 찾아보니 곱셈을 하기 전에 초기 값을 1로 설정을 하는게 좋다고 함</li>
<li>그래서 for문 시작 전 <code>answer = 1</code>을 추가 함</li>
</ul>
<blockquote>
<h4 id="📌-곱셈의-항등원이란">📌 곱셈의 항등원이란?</h4>
</blockquote>
<ul>
<li>수학적으로 곱셈에서 1은 곱하기 연산에 대해 항등원 역할을 함</li>
<li>즉, 1로 초기화한 상태에서 다른 숫자를 곱하면, 결과가 정확하게 계산</li>
</ul>
<h3 id="💡-다른-사람의-정답">💡 다른 사람의 정답</h3>
<pre><code class="language-python">from math import prod
def solution(num_list):
    return (sum(num_list) if len(num_list) &gt; 10 else prod(num_list))</code></pre>
<ul>
<li>math모듈에서 prod함수를 가져오는 것
→ <code>prod</code> : 리스트의 모든 원소를 곱한 값을 반환하는 함수</li>
<li><code>return (sum(num_list) if len(num_list) &gt; 10 else prod(num_list))</code>
→ <code>len(num_list) &gt; 10</code> 조건이 <code>참</code>인 경우, sum(num_list)를 반환
즉, 리스트의 길이가 11 이상이면 리스트의 <strong>원소들의 합을 계산</strong>하여 반환
→ <code>len(num_list) &lt;= 10</code> 조건이 <code>거짓</code>인 경우, prod(num_list)를 반환
즉, 리스트의 길이가 10 이하이면 리스트의 원소들을 <strong>모두 곱한 값을 계산</strong>하여 반환</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[머신러닝] 머신러닝 프로세스]]></title>
            <link>https://velog.io/@seonyoung_3/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D</link>
            <guid>https://velog.io/@seonyoung_3/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D</guid>
            <pubDate>Wed, 21 Aug 2024 07:31:11 GMT</pubDate>
            <description><![CDATA[<h3 id="📁-예측-모델링-프로세스">📁 예측 모델링 프로세스</h3>
<p><img src="https://velog.velcdn.com/images/seonyoung_3/post/dfb148d7-9465-4718-99e6-1d3dd592e7ac/image.png" alt=""></p>
<h3 id="📁-데이터-수집">📁 데이터 수집</h3>
<ul>
<li>데이터 분석가는 이미 존재하는 데이터를 SQL 혹은 Python을 통해 추출하고 리포팅 혹은 머신러닝을 통한 예측을 담당</li>
</ul>
<h4 id="실제-데이터-수집">&lt;실제 데이터 수집&gt;</h4>
<ul>
<li>회사 내 데이터가 존재한다면<ul>
<li>SQL 혹은 Python 을 통해 데이터 마트를 생성</li>
</ul>
</li>
<li>회사 내 Data가 없다면 → 데이터 수집 필요<ul>
<li>방법1 : CSV, EXCEL 파일 다운로드</li>
<li>방법2 : API를 이용한 데이터 수집</li>
<li>방법3 : Data Crawling</li>
</ul>
</li>
</ul>
<h3 id="📁-탐색적-데이터-분석eda">📁 탐색적 데이터 분석(EDA)</h3>
<ul>
<li>탐색적 데이터 분석은 데이터의 시각화, 기술 통계 등의 방법을 통해 데이터를 이해하고 탐구하는 과정</li>
<li>이 과정에서 데이터에 대한 정보를 얻을 수도 있고, 적절한 모델링에 대한 정보도 얻을 수 있음</li>
<li>예측 모델링이 아니더라도 데이터 분석에서는 반드시 필요한 과정</li>
</ul>
<p><strong>ex) 기술 통계를 통한 EDA 예시</strong></p>
<ul>
<li><code>tips.describe()</code><ul>
<li><code>include=&#39;all&#39;</code> 옵션을 통해 범주형 데이터도 확인 가능 </li>
</ul>
</li>
</ul>
<p><strong>ex) 시각화를 이용한 EDA 예시</strong></p>
<ul>
<li>tips 데이터</li>
</ul>
<ol>
<li><p><strong>countplot</strong> : 범주형 자료의 빈도 수 시각화</p>
<ul>
<li>방법: 범주형의 데이터의 각 카테고리별 빈도수를 나타낼 때<ul>
<li>ex) 상점에서 판매되는 제품의 카테고리별 판매수 파악</li>
</ul>
</li>
<li>x축: 범주형 자료</li>
<li>y축: 자료의 빈도수</li>
</ul>
</li>
<li><p><strong>barplot</strong> : <strong>범주형</strong> 자료의 시각화 </p>
<ul>
<li>방법: 범주형 데이터의 각 카테고리에 따른 수치 데이터의 평균을 비교<ul>
<li>ex) 다양한 연령대별 평균소득을 비교할 때</li>
</ul>
</li>
<li>x축: 범주형 자료</li>
<li>y축: 연속형 자료</li>
</ul>
</li>
<li><p><strong>boxplot</strong> : <strong>수치형 &amp; 범주형</strong> 자료의 시각화</p>
<ul>
<li>방법: 데이터의 분포, 중앙값, 사분위 수, 이상치 등을 한눈에 표현하고 싶을 때<ul>
<li>ex) 여러 그룹간 시험 점수 분포를 비교할 때</li>
</ul>
</li>
<li>x: 수치형 or 범주형</li>
<li>y: 수치형 자료</li>
</ul>
</li>
<li><p><strong>histogram</strong> : 수치형 자료 빈도 시각화</p>
<ul>
<li>방법: 연속형 분포를 나타내고 싶을 때, 데이터가 몰려있는 구간을 파악하기 쉬움<ul>
<li>ex)고객들의 연령 분포를 파악 할 때</li>
</ul>
</li>
<li>x축: 수치형 자료</li>
<li>y축: 자료의 빈도수</li>
</ul>
</li>
<li><p><strong>scatterplot</strong> : 수치형끼리 자료의 시각화</p>
<ul>
<li>방법: 두 연속형 변수간의 관계를 시각적으로 파악하고 싶을 때<ul>
<li>ex) 키와 몸무게 간의 관계를 나타낼 때</li>
</ul>
</li>
<li>x축: 수치형 자료</li>
<li>y축: 수치형 자료</li>
</ul>
</li>
<li><p><strong>pairplot</strong> : 전체 변수에 대한 시각화</p>
<ul>
<li>방법: 한 번에 여러 개의 변수를 동시에 시각화 하고 싶을 때</li>
<li>x축: 범주형 or 수치형 자료</li>
<li>y축: 범주형 or 수치형 자료</li>
<li>대각선: 히스토그램(분포)
<img src="https://velog.velcdn.com/images/seonyoung_3/post/c584d9fe-ac04-4262-9671-a5cbee48d125/image.png" alt=""></li>
</ul>
</li>
</ol>
<h3 id="📁-데이터-전처리">📁 데이터 전처리</h3>
<ul>
<li>이는 <strong>전체 분석 프로세스에서 90%를 차지</strong> 할 정도로 노동, 시간 집약적인 단계</li>
</ul>
<h4 id="이상치outlier">&lt;이상치(Outlier)&gt;</h4>
<ul>
<li>이상치란 보통 관측된 데이터 범위에서 <strong>많이 벗어난 아주 작은 값 혹은 큰 값</strong></li>
</ul>
<ol>
<li><p>Extreme Studentized Deviation(ESD) 이용한 이상치 발견</p>
<ul>
<li>데이터가 정규분포를 따른다고 가정할 때, 평균에서 표준편차의 3배 이상 떨어진 값</li>
<li>모든 데이터가 정규 분포를 따르지 않을 수 있기 때문에 다음 상황에서는 제한됨<ul>
<li>데이터가 크게 비대칭일 때( → Log변환 등을 노려볼 수 있음)</li>
<li>샘플 크기가 작을 경우
<img src="https://velog.velcdn.com/images/seonyoung_3/post/59c314a2-7938-4c6b-9bdf-4e72cacece23/image.png" alt=""></li>
</ul>
</li>
</ul>
</li>
<li><p>IQR(Inter Quantile Range)를 이용한 이상치 발견</p>
<ul>
<li><p>ESD와 동일하게 데이터가 비대칭적이거나 샘플사이즈가 작은 경우 제한됨
<img src="https://velog.velcdn.com/images/seonyoung_3/post/4215fadd-6346-4c5a-b491-277708708a40/image.png" alt=""></p>
</li>
<li><p><strong>Box plot</strong>: 데이터의 사분위 수를 포함하여 분포를 보여주는 시각화 그래프, 상자-수염 그림이라고도 함</p>
<ul>
<li><strong>사분위 수</strong>: 데이터를 순서에 따라 4등분 한 것</li>
</ul>
<p>$$
Q1(25%), Q2(50%,중위수), Q3(75%) 
$$</p>
<p>$$
⁍
$$</p>
</li>
</ul>
</li>
</ol>
<p>$$
상한 \ 이상치 = Q3 + 1.5<em>IQR \ 하한 \ 이상치 = Q1 - 1.5</em>IQR
$$</p>
<ul>
<li>이상치 발견 방법<pre><code class="language-python"># ESD를 이용한 처리
import numpy as np
mean = np.mean(data)
std = np.std(data)
upper_limit = mean + 3*std
lower_limit = mean - 3*std</code></pre>
</li>
</ul>
<pre><code class="language-python"># IQR을 이용한 처리(box plot)
Q1 = df[&#39;column&#39;].quantile(0.25)
Q3 = df[&#39;column&#39;].qunatile(0.75)
IQR = Q3 - Q1
uppper_limit = Q3 + 1.5*IQR
lower_limit = Q1 - 1.5*IQR</code></pre>
<ul>
<li><p>조건필터링을 통한 삭제(a.k.a. boolean Indexing): <code>df[ df[&#39;column&#39;] &gt; limit_value]</code></p>
</li>
<li><p>이상치는 사실 주관적인 값(데이터를 삭제할지 말지는 분석가가 결정할 몫)</p>
</li>
<li><p>다만, 도메인과 비즈니스 맥락에 따라 그 기준이 달라지며, 데이터 삭제시 품실은 좋아질 수 있지만 정보 손실을 동반하기 때문에 이상치 처리에 주의해야 함(단지, 통계적 기준에 따라서 결정할 수도 있음)</p>
</li>
<li><p>또한, 이상 탐지(Anomaly Detection)이라는 이름으로 데이터에서 패턴을 다르게 보이는 개체 또는 자료를 찾는 방법으로도 발전할 수 있음
→ ex) 사기 탐지, 사이버 보안 등</p>
</li>
</ul>
<h4 id="결측치missing-value">&lt;결측치(Missing Value)&gt;</h4>
<ul>
<li>이상치가 분포에 크게 어긋나는 특이한 데이터라면, 결측치는 존재하지 않는 데이터</li>
<li>결측치 처리 방법<ul>
<li><strong>수치형 데이터</strong><ul>
<li>평균 값 대치: 대표적인 대치 방법</li>
<li>중앙값 대치: 데이터에 이상치가 많아 평균 값이 대표성이 없다면 중앙 값을 이용
ex) 이상치는 평균 값을 흔들리게 함            </li>
</ul>
</li>
<li><strong>범주형 데이터</strong><ul>
<li>최빈값 대치</li>
</ul>
</li>
<li>사용 함수<ul>
<li>간단한 삭제 &amp; 대치<ul>
<li><code>df.dropna(axis = 0)</code>: 행 삭제</li>
<li><code>df.dropna(axis = 1)</code>: 열 삭제</li>
<li>Boolean Indexing</li>
<li><code>df.fillna(value)</code>: 특정 값으로 대치(평균, 중앙, 최빈값)</li>
</ul>
</li>
<li>알고리즘을 이용<ul>
<li><code>sklearn.impute.SimpleImputer</code>:평균, 중앙, 최빈값으로 대치<ul>
<li><code>SimpleImputer.statistics_</code> : 대치한 값 확인 가능</li>
</ul>
</li>
<li><code>sklearn.impute.IterativeImputer</code>: 다변량대치(회귀 대치)</li>
<li><code>sklearn.impute.KNNImputer</code>: KNN 알고리즘을 이용한 대치</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>→ 📌 위와 같이 간단하게 결측치를 대치할 수도 있지만, 알고리즘을 이용해 대치할 수도 있음</p>
<h4 id="범주형-데이터-전처리---인코딩encoding">&lt;범주형 데이터 전처리 - 인코딩(Encoding)&gt;</h4>
<ul>
<li>인코딩의 사전적 뜻은 어떤 정보를 정해진 규칙에 따라 변환하는 것</li>
<li>반면 우리가 만든 머신러닝 모델은 숫자를 기반으로 학습하기 때문에 반드시 인코딩 과정이 필요</li>
</ul>
<ol>
<li><p><strong>레이블 인코딩(Label Encoding)</strong></p>
<ul>
<li>정의: 문자열 범주형 값을 고유한 숫자로 할당<ul>
<li>1등급 → 0</li>
<li>2등급 → 1</li>
<li>3등급 → 2</li>
</ul>
</li>
<li>특징<ul>
<li>장점: 모델이 처리하기 쉬운 수치형으로 데이터 변환</li>
<li>단점: 실제로는 그렇지 않은데, 순서 간 크기에 의미가 부여되어 모델이 잘못 해석 할 수 있음</li>
</ul>
</li>
<li>사용 함수<ul>
<li><code>sklearn.preprocessing.LabelEncoder</code></li>
<li>메소드<ul>
<li><code>fit</code>: 데이터 학습</li>
<li><code>transform</code>: 정수형 데이터로 변환</li>
<li><code>fit_transform</code>: fit과 transform을 연결하여 한번에 실행</li>
<li><code>inverse_transform</code> : 인코딩된 데이터를 원래 문자열로 변환</li>
</ul>
</li>
<li>속성<ul>
<li><code>classes_</code>: 인코더가 학습한 클래스(범주)</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><p><strong>원-핫 인코딩(One-Hot Encoding)</strong></p>
<ul>
<li>정의: 각 범주를 이진 형식으로 변환하는 기법<ul>
<li>빨강 → [1,0,0]</li>
<li>파랑 → [0,1,0]</li>
<li>초록 → [0,0,1]</li>
</ul>
</li>
<li>특징<ul>
<li>장점: 각 범주가 독립적으로 표현되어, 순서가 중요도를 잘못 학습하는 것을 방지, 명목형 데이터에 권장</li>
<li>단점: 범주 개수가 많을 경우 차원이 크게 증가(차원의 저주) , 모델의 복잡도를 증가, 과적합 유발</li>
</ul>
</li>
<li>사용 함수<ul>
<li><code>pd.get_dummies</code></li>
<li><code>sklearn.preprocessing.OneHotEncoder</code><ul>
<li>메소드(LabelEncoder와 동일)</li>
<li><code>categories_</code>: 인코더가 학습한 클래스(범주)</li>
<li><code>get_feature_names_out()</code>: 학습한 클래스 이름(리스트)<pre><code class="language-python"># CSR 데이터 데이터프레임으로 만들기
csr_df = pd.DataFrame(csr_data.toarray(), columns = oe.get_feature_names_out())
# 기존 데이터프레임에 붙이기(옆으로)
pd.DataFrame([titaninc_df,csr_df], axis = 1) </code></pre>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ol>
<h4 id="수치형-데이터-전처리---스케일링scaling">&lt;수치형 데이터 전처리 - 스케일링(Scaling)&gt;</h4>
<ul>
<li><strong>인코딩</strong>이 범주형 자료에 대한 전처리라고 한다면, <strong>스케일링</strong>은 수치형 재료에 대한 전처리</li>
<li>머신러닝의 학습에 사용되는 데이터들은 서로 단위 값이 다르기 때문에 이를 보정하는 것</li>
</ul>
<ol>
<li><p><strong>표준화(Standardization)</strong></p>
<ul>
<li><p>각 데이터에 평균을 빼고 표준편차를 나누어 평균을 0 표준편차를 1로 조정하는 방법</p>
</li>
<li><p>수식</p>
<p>  $$
  x_{new} = \frac{x-x_{mean}}{x_{std}}
  $$</p>
</li>
<li><p>함수: <code>sklearn.preprocessing.StandardScaler</code></p>
<ul>
<li>메소드<ul>
<li><code>fit</code> : 데이터학습(평균과 표준편차를 계산)</li>
<li><code>transform</code>: 데이터 스케일링 진행</li>
</ul>
</li>
<li>속성<ul>
<li><code>mean_</code>: 데이터의 평균 값</li>
<li><code>scale_</code>, <code>var_</code>: 데이터의 표준 편차,분산 값</li>
<li><code>n_features_in_</code>: fit 할 때 들어간 변수 개수</li>
<li><code>feature_names_in_</code>: fit 할 때 들어간 변수 이름</li>
<li><code>n_samples_seen_</code> : fit 할 때 들어간 데이터의 개수</li>
</ul>
</li>
</ul>
</li>
<li><p>특징</p>
<ul>
<li>장점<ul>
<li>이상치가 있거나 분포가 치우쳐져 있을 때 유용</li>
<li>모든 특성의 스케일을 동일하게 맞춤 / 많은 알고리즘에서 좋은 성능</li>
</ul>
</li>
<li>단점<ul>
<li>데이터의 최소-최대 값이 정해지지 않음.</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><p><strong>정규화(Normalization)</strong></p>
<ul>
<li><p>정의: 데이터를 0과 1사이 값으로 조정(최소값 0, 최대값 1)</p>
</li>
<li><p>수식</p>
<p>$$
x_{norm} = \frac{x-x_{min}}{x_{max}-x_{min}}
$$</p>
</li>
<li><p>함수: <code>sklearn.preprocessing.MinMaxScaler</code></p>
<ul>
<li>(표준화와 공통인 것은 제외)</li>
<li>속성<ul>
<li><code>data_min_</code>: 원 데이터의 최소 값</li>
<li><code>data_max_</code>: 원 데이터의 최대 값</li>
<li><code>data_range_</code> : 원 데이터의 최대-최소 범위</li>
</ul>
</li>
</ul>
</li>
<li><p>특징</p>
<ul>
<li>장점<ul>
<li>모든 특성의 스케일을 동일하게 맞춤</li>
<li>최대-최소 범위가 명확</li>
</ul>
</li>
<li>단점:<ul>
<li>이상치에 영향을 많이 받을 수 있음(반대로 말하면 이상치가 없을 때 유용)</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><p><strong>로버스트 스케일링(Robust Scaling)</strong></p>
<ul>
<li><p>정의: 중앙값과 IQR을 사용하여 스케일링</p>
</li>
<li><p>수식</p>
<p>$$
x_{robust} = \frac{x-median}{IQR}
$$</p>
</li>
<li><p>특징</p>
<ul>
<li>장점: 이상치의 영향에 덜 민감</li>
<li>단점: 표준화와 정규화에 비해 덜 사용됨</li>
</ul>
</li>
<li><p>함수: <code>sklearn.preprocessing.RobustScaler</code></p>
<ul>
<li>속성<ul>
<li><code>center_</code>: 훈련 데이터의 중앙값</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ol>
<h3 id="📁-데이터-분리">📁 데이터 분리</h3>
<h4 id="과적합은-머신러닝의-적">&lt;과적합은 머신러닝의 적&gt;</h4>
<ul>
<li><p>국소적인 문제를 해결하는 것에 집중한 나머지 일반적인 문제를 해결하지 못하는 현상을 <code>과대적합 이슈</code>라고 함</p>
</li>
<li><p>즉, <code>과대적합(Overfitting)</code>이란 데이터를 너무 과도하게 학습한 나머지 해당 문제만 잘 맞추고 새로운 데이터를 제대로 예측 혹은 분류하지 못하는 현상
<img src="https://velog.velcdn.com/images/seonyoung_3/post/96e5f802-997f-4425-bb56-8beec92b92e3/image.png" alt=""></p>
</li>
<li><p>예측 혹은 분류를 하기 위해서 모형을 복잡도를 설정</p>
<ul>
<li>모형이 지나치게 복잡할 때 : 과대 적합이 될 수 있음</li>
<li>모형이 지나치게 단순할 때:  과소 적합이 될 수 있음</li>
</ul>
</li>
<li><p><strong>과적합의 원인</strong></p>
<ul>
<li>모델의 복잡도(상기의 예시)</li>
<li>데이터 양이 충분하지 않음</li>
<li>학습 반복이 많음(딥러닝의 경우)</li>
<li>데이터 불균형(정상환자 - 암환자의 비율이 95: 5)</li>
</ul>
</li>
</ul>
<h4 id="과적합-해결---테스트-데이터의-분리">&lt;과적합 해결 - 테스트 데이터의 분리&gt;</h4>
<p><img src="https://velog.velcdn.com/images/seonyoung_3/post/f69089ff-db80-4fed-85e4-68033477086d/image.png" alt=""></p>
<ul>
<li><strong>학습 데이터(Train Data)</strong> : 모델을 학습(<code>fit</code>)하기 위한 데이터</li>
<li><strong>테스트 데이터(Test Data)</strong> : 모델을 평가 하기 위한 데이터</li>
<li>함수 및 파라미터 설명<ul>
<li><code>sklearn.model_selection.train_test_split</code><ul>
<li>파라미터<ul>
<li><code>test_size</code>: 테스트 데이터 세트 크기</li>
<li><code>train_size</code>: 학습 데이터 세트 크기</li>
<li><code>shuffle</code>: 데이터 분리 시  섞기</li>
<li><code>random_state</code>: 호출할 때마다 동일한 학습/테스트 데이터를 생성하기 위한 난수 값. 수행할 때 마다 동일한 데이터 세트로 분리하기 위해 숫자를 고정 시켜야 함</li>
</ul>
</li>
<li>반환 값(순서 중요)<ul>
<li><code>X_train</code>, <code>X_test</code>, <code>y_train</code>, <code>y_test</code></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="📁-데이터-전체-프로세스-적용-과정-예시">📁 데이터 전체 프로세스 적용 과정 예시</h3>
<ol>
<li><strong>데이터 로드 &amp; 분리</strong><ul>
<li>train / test 데이터 분리</li>
</ul>
</li>
<li><strong>탐색적 데이터 분석(EDA)</strong><ul>
<li>분포확인 &amp; 이상치 확인</li>
</ul>
</li>
<li><strong>데이터 전처리</strong><ul>
<li>결측치 처리<ul>
<li>수치형: Age</li>
<li>범주형: Embarked</li>
<li>삭제 : Cabin, Name</li>
</ul>
</li>
<li>전처리<ul>
<li>수치형: Age, Fare, Sibsp+Parch</li>
<li>범주형<ul>
<li>레이블 인코딩: Pclass, Sex</li>
<li>원- 핫 인코딩: Embarked</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><strong>모델 수립</strong></li>
<li><strong>평가</strong></li>
</ol>
<h3 id="📁-교차-검증과-gridsearch">📁 교차 검증과 GridSearch</h3>
<h4 id="교차-검증cross-validation">&lt;교차 검증(Cross Validation)&gt;</h4>
<ul>
<li>모델을 평가하기 위한 별도의 테스트 데이터로 평가하더라도 고정된 테스트 데이터가 존재하기 때문에 과적합에 취약한 단점이 있음</li>
<li>이를 피하기 위한 <strong>교차검증</strong>방법이 있음
→  📌 <code>교차 검정</code>이란 데이터 셋을 여러 개의 하위 집합으로 나누어 돌아가면서 검증 데이터로 사용하는 방법</li>
<li><strong>K-Fold Validation</strong><ul>
<li>Train Data를 <strong>K개의 하위 집합으로 나누어</strong> 모델을 <strong>학습</strong>시키고 모델을 <strong>최적화</strong> 하는 방법</li>
<li>이때 K는 분할의 갯수<ul>
<li>Split 1: 학습용(Fold 2~5), 검증용(Fold1)</li>
<li>Split 2: 학습용(Fold1, 3~5), 검증용(Fold2)</li>
<li>Split 5까지 반복 후 최종 평가
<img src="https://velog.velcdn.com/images/seonyoung_3/post/4404f3e7-904b-482a-a136-617ee155ca99/image.png" alt=""></li>
</ul>
</li>
</ul>
</li>
<li>특징<ul>
<li>데이터가 부족할 경우 유용합니다.(반복 학습)</li>
</ul>
</li>
<li>함수<ul>
<li><code>skelarn.model_selection.KFold</code></li>
<li><code>sklearn.model_selection.StrifiedKFold</code>: 불균형한 레이블(Y)를 가지고 있을 때 사용</li>
</ul>
</li>
</ul>
<h4 id="하이퍼-파라미터-자동적용하기---gridsearchv">&lt;하이퍼 파라미터 자동적용하기 - GridSearchV&gt;</h4>
<ul>
<li><code>하이퍼 파라미터(Hyper Parameter)</code> : 모델을 구성하는 입력 값 중 사람이 임의적으로 바꿀 수 있는 입력 값</li>
<li>다양한 값을 넣고 실험할 수 있기 때문에 이를 자동화해주는 <code>Grid Search</code>를 적용해볼 수 있음</li>
</ul>
<blockquote>
<h3 id="💡-데이터-분석-프로세스-총-정리전체-데이터-프로세스">💡 데이터 분석 프로세스 총 정리(전체 데이터 프로세스)</h3>
</blockquote>
<p><img src="https://velog.velcdn.com/images/seonyoung_3/post/60428b90-d180-4ff6-a629-509165d01ee3/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코드카타] 왼쪽 오른쪽]]></title>
            <link>https://velog.io/@seonyoung_3/%EC%BD%94%EB%93%9C%EC%B9%B4%ED%83%80-%EC%99%BC%EC%AA%BD-%EC%98%A4%EB%A5%B8%EC%AA%BD</link>
            <guid>https://velog.io/@seonyoung_3/%EC%BD%94%EB%93%9C%EC%B9%B4%ED%83%80-%EC%99%BC%EC%AA%BD-%EC%98%A4%EB%A5%B8%EC%AA%BD</guid>
            <pubDate>Tue, 20 Aug 2024 11:07:24 GMT</pubDate>
            <description><![CDATA[<h3 id="📁-문제">📁 문제</h3>
<p>문자열 리스트 str_list에는 &quot;u&quot;, &quot;d&quot;, &quot;l&quot;, &quot;r&quot; 네 개의 문자열이 여러 개 저장되어 있습니다. str_list에서 &quot;l&quot;과 &quot;r&quot; 중 먼저 나오는 문자열이 &quot;l&quot;이라면 해당 문자열을 기준으로 왼쪽에 있는 문자열들을 순서대로 담은 리스트를, 먼저 나오는 문자열이 &quot;r&quot;이라면 해당 문자열을 기준으로 오른쪽에 있는 문자열들을 순서대로 담은 리스트를 return하도록 solution 함수를 완성해주세요. &quot;l&quot;이나 &quot;r&quot;이 없다면 빈 리스트를 return합니다.</p>
<h3 id="📁-입출력-예">📁 입출력 예</h3>
<p><img src="https://velog.velcdn.com/images/seonyoung_3/post/12204a1d-7632-4dff-90fa-56da6734ba07/image.png" alt=""></p>
<h3 id="💡-내가-적은-오답">💡 내가 적은 오답</h3>
<pre><code class="language-python">def solution(str_list):
    answer = []

    for i in range(len(str_list)):
        if i == &quot;l&quot;:
            return str_list[:i]
        elif i == &quot;r&quot;:
            return str_list[i+1:]
        else:
            return []</code></pre>
<p><img src="https://velog.velcdn.com/images/seonyoung_3/post/edc120f6-7452-49ea-9e25-0d1e428c92ba/image.png" alt=""></p>
<ul>
<li>나름 정답일 것 같다는 생각으로 코드 실행을 눌렀지만 테스트 두 개 중 하나를 틀렸다..</li>
</ul>
<h3 id="💡-내가-적은-정답">💡 내가 적은 정답</h3>
<pre><code class="language-python">def solution(str_list):

    for i in range(len(str_list)):
        if str_list[i] == &quot;l&quot;:
            return str_list[:i]
        elif str_list[i] == &quot;r&quot;:
            return str_list[i+1:]
    else:
        return []</code></pre>
<ul>
<li>고민하다가 들여쓰기를 잘못했나라는 생각이 들어서 else의 들여쓰기를 바꿔봤더니 정답...!</li>
<li>else 구문을 if, elif에 맞추는 것이 아닌 for 루프에 맞춰도 되는지 의문이 들어 찾아봄<ul>
<li>파이썬에서 else 블록은 루프가 정상적으로 끝날 때 실행되도록 설계되어 있기 때문에 else 구문은 for 루프와 맞춰서 들여쓰기를 하는 것이 맞음</li>
</ul>
</li>
</ul>
<h4 id="📌-else와-for-루프의-관계">📌 &lt;else와 for 루프의 관계&gt;</h4>
<p><strong>1. else 구문 위치</strong>
    - else 블록은 for 루프의 블록 내부에 위치해야 하며, for 루프가 반복을 마친 후 실행됨
    - 즉, for 루프가 중간에 return 문으로 종료되지 않고 <strong>끝까지 실행된 경우에만 else 블록이 실행됨</strong>
<strong>2. 들여쓰기</strong>
    - else 블록의 들여쓰기는 for 루프와 같은 수준으로 맞춰야 함
    - 즉, for 루프의 내부 블록과 같은 들여쓰기를 사용하여 else 블록이 for 루프와 연결되어 있다는 것을 명확히 해야 함</p>
<h3 id="💡-또-다른-정답">💡 또 다른 정답</h3>
<pre><code class="language-python">def solution(str_list):

    for i in range(len(str_list)):
        if str_list[i] == &quot;l&quot;:
            return str_list[:i]
        elif str_list[i] == &quot;r&quot;:
            return str_list[i+1:]

    return []</code></pre>
<ul>
<li>이렇게 애초에 <code>else 구문</code>을 작성 안하고 바로 <code>return []</code>를 해도 결과가 나온다는 것을 알게 되어 생각지도 못해 신기해서 가져와 보았음</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[아티클] 확실히 알아두면 편해지는 머신러닝 10가지 알고리즘]]></title>
            <link>https://velog.io/@seonyoung_3/%EC%95%84%ED%8B%B0%ED%81%B4-%ED%99%95%EC%8B%A4%ED%9E%88-%EC%95%8C%EC%95%84%EB%91%90%EB%A9%B4-%ED%8E%B8%ED%95%B4%EC%A7%80%EB%8A%94-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-10%EA%B0%80%EC%A7%80-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98</link>
            <guid>https://velog.io/@seonyoung_3/%EC%95%84%ED%8B%B0%ED%81%B4-%ED%99%95%EC%8B%A4%ED%9E%88-%EC%95%8C%EC%95%84%EB%91%90%EB%A9%B4-%ED%8E%B8%ED%95%B4%EC%A7%80%EB%8A%94-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-10%EA%B0%80%EC%A7%80-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98</guid>
            <pubDate>Mon, 19 Aug 2024 11:55:33 GMT</pubDate>
            <description><![CDATA[<h3 id="📁-1-선형-회귀linear-regression">📁 1. 선형 회귀(Linear Regression)</h3>
<ul>
<li>가장 기초 적인 머신러닝 모델</li>
<li>여러 가지 데이터를 활용하여 <strong>연속형 변수인 목표 변수를 예측</strong>해 내는 것이 목적
ex) 몸무게, 나이, BMI, 성별 등을 데이터로 활용하여 키와 같은 <strong>연속형 변수를 예측</strong>하는 것
→ 남성/여성으로 구분되는 성별은 연속형 변수가 아님</li>
<li>선형 회귀 모델은 <strong>예측할 종속 변수만 연속형 변수</strong>이어야 하며, 예측하는데 사용되는 <strong>그외 변수들은 연속형일 필요는 없음</strong></li>
<li>구분 : 지도 학습</li>
<li>문제 유형 : 회귀</li>
<li>적합한 데이터 유형 : 종속변수와 독립변수가 선형 관계에 있는 데이터
→ 복잡한 알고리즘에 비해서는 예측력이 떨어지지만 데이터 특성이 복잡하지 않을 때는 쉽고 빠른 예측이 가능하기 때문에 많이 사용됨
→ 다른 모델과의 성능을 비교하는 베이스라인으로 사용하기도 함</li>
</ul>
<h4 id="장점">&lt;장점&gt;</h4>
<ul>
<li>모델이 간단하기 때문에 <strong>구현과 해석이 쉬움</strong></li>
<li>같은 이유로 모델링하는 데 <strong>오랜 시간이 걸리지 않음</strong></li>
</ul>
<h4 id="단점">&lt;단점&gt;</h4>
<ul>
<li>최신 알고리즘에 비해 <strong>예측력이 떨어짐</strong></li>
<li>독립변수와 예측변수의 선형 관계를 전제로 하기 때문에, 이러한 전제에서 벗어나는 데이터에서는 좋은 예측을 보여주기 어려움</li>
</ul>
<h4 id="예시">&lt;예시&gt;</h4>
<ul>
<li>연속된 변수를 예측하는 데 사용</li>
<li>BMI(체질량지수), 매출액, 전력 사용량과 같은 변수</li>
</ul>
<h3 id="📁-2-로지스틱-회귀logistic-regression">📁 2. 로지스틱 회귀(Logistic Regression)</h3>
<ul>
<li>선형회귀처럼 기본 분석 모델</li>
<li>알고리즘의 근간을 선형 회귀 분석에 두고 있어서 <strong>선형 회귀 분석과 상당히 유사하지만 다루는 문제가 다름</strong></li>
<li>선형 회귀 분석은 연속된 변수를 예측하는 반면, 로지스틱 회귀 분석은 <code>Yes/No</code>처럼 <strong>두 가지로 나뉘는 분류 문제</strong>를 다룸</li>
<li>구분 : 지도 학습</li>
<li>문제 유형 : 분류</li>
<li>적합한 데이터 유형 : 종속변수와 독립변수가 선형 관계에 있는 데이터
→ 너무 기본 알고리즘이라 꼭 알고 있어야 함
→ 실제 이진분류가 필요한 상황이 많이 때문에 두 가지 범주를 구분하는 간단한 예측에 유용하며 딥러닝에서도 기본 지식</li>
</ul>
<h4 id="장점-1">&lt;장점&gt;</h4>
<ul>
<li>선혀 회귀 분석만큼 <strong>구현하기 용이</strong></li>
<li><code>계수(기울기)</code>를 사용해 <strong>각 변수의 중요성을 쉽게 파악</strong>할 수 있음</li>
</ul>
<h4 id="단점-1">&lt;단점&gt;</h4>
<ul>
<li>선형 회귀 분석을 근간으로 하고 있기 때문에, <strong>선형 관계가 아닌 데이터에 대한 예측력이 떨어짐</strong></li>
</ul>
<h4 id="예시-1">&lt;예시&gt;</h4>
<ul>
<li><code>Yes/No</code>, <code>True/False</code>와 같은 두 가지 범주로 나뉜 값을 예측하는 데 사용</li>
<li>분류 문제에 있어서 기준선 베이스라인으로 자주 활용<strong>(타 모델과 비교 목적)</strong></li>
</ul>
<h3 id="📁-3-k-최근접-이웃knn">📁 3. K-최근접 이웃(KNN)</h3>
<ul>
<li><strong>거리 기반 모델</strong></li>
<li>선형 관계를 전제로 하지 않음</li>
<li><strong>각 데이터 간의 거리를 활용해서 새로운 데이터를 예측하는 모델</strong></li>
<li>가까이에 있는 데이터를 고려하여 예측값이 결정됨</li>
<li>구분 : 지도학습</li>
<li>문제 유형 : 회귀/분류</li>
<li>적합한 데이터 유형 : 아웃라이어가 적은 데이터
→ 다중분류 문제에 가장 간편히 적용할 수 있는 알고리즘(베이스라인 모델로도 사용)</li>
</ul>
<h4 id="장점-2">&lt;장점&gt;</h4>
<ul>
<li>수식에 대한 설명이 필요 없을 만큼 <strong>직관적이고 간단</strong></li>
<li>선형 모델과 다르게 <strong>별도의 가정이 없음</strong>
ex) <code>선형 회귀</code>는 독립변수와 종속변수의 선형 관계를 가정하고 있기 때문에 가정에 들어맞지 않는 데이터에 취약하나, <code>KNN</code>은 이러한 가정이 없어 더 자유로움</li>
</ul>
<h4 id="단점-2">&lt;단점&gt;</h4>
<ul>
<li><strong>데이터가 커질수록 상당히 느려질 수 있음</strong></li>
<li><strong>아웃라이어에 취약</strong></li>
</ul>
<h4 id="예시-2">&lt;예시&gt;</h4>
<ul>
<li>주로 분류(Classification)에서 사용되며, 로지스틱 회귀(Logistic Regression)로 해결할 수 없는 3개 이상의 목표 변수들도 분류할 수 있음</li>
<li>작은 데이터셋에 적합</li>
</ul>
<h3 id="📁-4-나이브-베이즈naive-bayes">📁 4. 나이브 베이즈(Naive Bayes)</h3>
<ul>
<li>베이즈 정리를 적용한 <strong>조건부 확률 기반의 분류</strong> 모델
→ 조건부 확률 : <strong>A가 일어났을 때 B가 일어날 확률을 의미</strong>
ex) &#39;무료라는 단어가 들어 있을 때 해당 메일이 스팸일 확률&#39; (이러한 특징으로 <strong>스팸 필터링을 위한 대표적인 모델</strong>로 꼽힘)</li>
<li>구분 : 지도 학습</li>
<li>문제 유형 : 분류</li>
<li>적합한 데이터 유형 : 독립변수의 종류가 매우 많은 경우고리즘
→ 범용성이 높지는 않지만 독립변수들이 모두 독립적이라면 충분히 경쟁력 있는 알고리즘
→ 딥러닝을 제외하고 자연어 처리에 가장 적합한 알고리즘</li>
</ul>
<h4 id="장점-3">&lt;장점&gt;</h4>
<p>-** 비교적 간단한** 알고리즘에 속하며 <strong>속도</strong> 또한 <strong>빠름</strong></p>
<ul>
<li>작은 훈련셋으로도 잘 예측함</li>
</ul>
<h4 id="단점-3">&lt;단점&gt;</h4>
<ul>
<li>모든 독립변수가 각각 독립적임을 전제로 하는데 이는 장점이 되기도 하고 단점이 되기도 함
→ 실제 독립변수들이 모두 독립적이라면 다른 알고리즘보다 우수할 수 있지만, 실제 데이터에서 그런 경우가 많지 않기에 단점임</li>
</ul>
<h4 id="예시-3">&lt;예시&gt;</h4>
<ul>
<li>각 독립변수들이 <strong>모두 독립적</strong>이고, 그 <strong>중요도가 비슷</strong>할 때 유용</li>
<li>자연어 처리(NLP)에서 간단하지만 좋은 성능을 보여줌</li>
<li><strong>범주 형태의 변수가 많을 때 적합</strong>하며, 숫자형 변수가 많은 때는 적합하지 않음</li>
</ul>
<h3 id="📁-5-결정-트리decision-tree">📁 5. 결정 트리(Decision Tree)</h3>
<ul>
<li>관측값과 목푯값을 연결시켜주는 <strong>예측 모델로서 나무 모양으로 데이터를 분류</strong></li>
<li>수많은 트리 기반 모델의 기본 모델이 되는 중요 모델</li>
<li>트리 기반 모델은 선형 모델과는 전혀 다른 특징을 가지며, 선형 모델이 각 변수에 대한 기울기 값들을 최적화하여 모델을 만들어 나갔다면, 트리 모델에서는 <strong>각 변수의 특정 지점을 기준으로 데이터를 분류해가며 예측 모델을 만듦</strong>
ex) <code>남자/여자</code>로 나눠서 각 목푯값 평균치를 나눈다거나, 나이를 30세 <code>이상/미만</code>인 두 분류로 나눠서 평균치를 계산하는 방식으로 데이터를 <strong>무수하게 쪼개어</strong> 나가고, <strong>각 그룹에 대한 예측치</strong>를 만들어 냄</li>
<li>구분 : 지도 학습</li>
<li>문제 유형 : 회귀/분류</li>
<li>적합한 데이터 유형 : 일반적인 데이터
→ 예측력과 성능으로만 따지면 시각화가 매우 뛰어나다는 유일한 장점이 있을 뿐 결정 트리 모델을 사용할 일은 없음
→ 하지만 트리 기반 모델은 딥러닝을 제외하고 현재 가장 유용하고 많이 쓰이는 트렌드임</li>
</ul>
<h4 id="장점-4">&lt;장점&gt;</h4>
<ul>
<li>데이터에 대한 <strong>가정이 없는 모델</strong></li>
<li>ex) 선형 모델은 정규분포에 대한 가정이나 독립변수와 종속변수의 선형 관계 등을 가정으로 하는 모델인 반면, 결정 트리는 데이터에 대한 가정이 없으므로 어디에나 자유롭게 적용할 수 있음</li>
<li><strong>아웃라이어에 영향을 거의 받지 않음</strong></li>
<li>트리 그래프를 통해서 <strong>직관적으로 이해</strong>하고 설명할 수 있음(즉, 시각화에 굉장히 탁월)</li>
</ul>
<h4 id="단점-4">&lt;단점&gt;</h4>
<ul>
<li>트리가 <strong>무한정 깊어지면 오버피팅 문제</strong>를 야기할 수 있음</li>
<li>앞으로 배울 발전된 트리 기반 모델들에 비하면 <strong>예측력이 상당히 떨어짐</strong></li>
</ul>
<h4 id="예시-4">&lt;예시&gt;</h4>
<ul>
<li>종속변수가 연속형 데이터와 범주형 데이터 모두 사용할 수 있음</li>
<li>모델링 결과를 시각화할 목적으로 가장 유용</li>
<li>아웃라이어가 문제될 정도로 많을 때 선형 모델보다 좋은 대안이 될 수 있음</li>
</ul>
<h3 id="📁-6-랜덤-포레스트random-forest">📁 6. 랜덤 포레스트(Random Forest)</h3>
<ul>
<li>결정 트리의 단점인 <strong>오버피팅 문제를 완화시켜주는 발전된 형태</strong>의 트리 모델</li>
<li><code>랜덤으로</code> 생성된 <strong>무수히 많은 트리를 이용하여 예측</strong>하기 때문에 랜덤 포레스트라 불림
→ 여러 모델(여기서는 결정 트리)을 활용하여 하나의 모델을 이루는 기법을 <code>앙상블</code>이라 부름</li>
<li>구분 : 지도학습</li>
<li>문제 유형 : 회귀/분류</li>
<li>적합한 데이터 유형 : 일반적인 데이터
→ 앙상블 기법을 사용한 기반 모델 중 가장 보편적인 방법</li>
</ul>
<h4 id="장점-5">&lt;장점&gt;</h4>
<ul>
<li>결정 트리와 마찬가지로, <strong>아웃라이어에 거의 영향을 받지 않음</strong></li>
<li><code>선형/비선형</code> 데이터에 상관없이 잘 작동</li>
</ul>
<h4 id="단점-5">&lt;단점&gt;</h4>
<ul>
<li><strong>학습 속도</strong>가 상대적으로 <strong>느린 편</strong></li>
<li>수많은 트리를 동원하기 때문에 <strong>모델에 대한 해석이 어려움</strong></li>
</ul>
<h3 id="📁-7-xg부스트xgboost">📁 7. XG부스트(XGBoost)</h3>
<ul>
<li>랜덤 포레스트는 각 트리를 독립적으로 만드는 알고리즘이나 부스팅은 <strong>순차적으로 트리를 만들어</strong> 이전 트리로부터 <strong>더 나은 트리를 만들어 내는 알고리즘</strong></li>
<li>트리 모델을 기반으로 한 최신 알고리즘 중 하나로, 랜덤 포레스트보다 훨씬 빠른 속도와 더 좋은 예측 능력을 보여줌</li>
<li><strong>손실함수뿐만 아니라 모형 복잡도까지 고려함</strong></li>
<li>구분 : 지도 학습</li>
<li>문제 유형 : 회귀/분류</li>
<li>적합한 데이터 유형 : 일반적인 데이터 </li>
</ul>
<h4 id="장점-6">&lt;장점&gt;</h4>
<ul>
<li><strong>예측 속도가 상당히 빠르며, 예측력 또한 좋음</strong></li>
<li><strong>변수 종류가 많고 데이터가 클수록</strong> 상대적으로 뛰어난 성능을 보여줌</li>
</ul>
<h4 id="단점-6">&lt;단점&gt;</h4>
<ul>
<li>복잡한 모델인 만큼, 해석에 어려움이 있음</li>
<li>더 나은 성능을 위한 하이퍼파라미터 튜닝이 까다로움</li>
</ul>
<h3 id="📁-8-라이트gbmlightgbm">📁 8. 라이트GBM(LightGBM)</h3>
<ul>
<li>XGBoost 이후로 나온 최신 부스팅 모델</li>
<li><strong>리프 중심 트리 분할 방식을 사용</strong></li>
<li>구분 : 지도 학습</li>
<li>문제 유형 : 회귀/분류</li>
<li>적합한 데이터 유형 : 일반적인 데이터</li>
</ul>
<h4 id="장점-7">&lt;장점&gt;</h4>
<ul>
<li>XGBoost보다도 <strong>빠르고 높은 정확도</strong>를 보여주는 경우가 많음</li>
<li>예측에 영향을 미친 <strong>변수의 중요도</strong>를 확인할 수 있음</li>
<li>변수 종류가 많고 데이터가 클수록 상대적으로 뛰어난 성능을 보여줌</li>
</ul>
<h4 id="단점-7">&lt;단점&gt;</h4>
<ul>
<li>복잡한 모델인 만큼, <strong>해석에 어려움</strong>이 있음</li>
<li>하이퍼파라미터 유닝이 <strong>까다로움</strong></li>
</ul>
<h3 id="📁-9-k-평균-군집화k-means-clustering">📁 9. K-평균 군집화(K Means Clustering)</h3>
<ul>
<li>비지도 학습의 대표적인 알고리즘 중 <strong>목표 변수가 없는 상태</strong>에서 데이터를 <strong>비슷한 유형끼리 묶어내는 머신러닝 기법</strong></li>
<li><strong>거리 기반으로 작동</strong>하며 적절한 <strong>K값을 사용자가 지정</strong>해야 함</li>
<li>거리 기반으로 작동하기 때문에 데이터 위치가 가까운 데이터끼리 한 그룹으로 묶음(이때 전체 그룹의 수는 사용자가 지정한 K개)
→ 수많은 데이터를 가지고 있을 때, 데이터를 하나하나 직접 살펴보기에는 시간적인 한계가 따름
→ 클러스터링은 이러한 상황에서 데이터를 적절한 수의 그룹으로 나누고 그 특징을 살펴볼 수 있는 장점을 제공</li>
</ul>
<h4 id="장점-8">&lt;장점&gt;</h4>
<ul>
<li><strong>구현이 비교적 간단</strong></li>
<li>클러스터링 결과를 <strong>쉽게 해석</strong>할 수 있음</li>
</ul>
<h4 id="단점-8">&lt;단점&gt;</h4>
<ul>
<li><strong>최적의 K값</strong>을 자동으로 찾지 못하고, <strong>사용자가 직접 선택</strong>해야 함</li>
<li>거리 기반 알고리즘이기 때문에, <strong>변수의 스케일에 따라 다른 결과</strong>를 나타낼 수 있음</li>
</ul>
<h3 id="📁-10-주성분-분석pca">📁 10. 주성분 분석(PCA)</h3>
<ul>
<li>Principal Component Analysis의 약자</li>
<li><strong>비지도 학습</strong>에 속하기 때문에 당연히 종속 변수는 존재하지 않고, <strong>어떤 것을 예측하지도 분류하지도 않음</strong></li>
<li>PCA의 목적은 <strong>데이터 차원을 축소하는 데 있음</strong>(<code>차원 축소</code> : 변수의 개수를 줄이되, 가능한 그 특성을 보존해내는 기법)</li>
<li>기존의 변수 중 일부를 그대로 선택하는 방식이 아니라, 기존 변수들의 정보를 <strong>모두 반영하는 새로운 변수들을 만드는 방식</strong>으로 차원 축소를 함
→ 차원 축소 방법 중 가장 인기 있으며 <strong>구현하기 또한 쉬운 편</strong></li>
</ul>
<h4 id="장점-9">&lt;장점&gt;</h4>
<ul>
<li>다차원을 2차원에 적합하도록 차원 축소하여 <strong>시각화에 유용</strong></li>
<li>변수 간의 <strong>높은 상관관계 문제를 해결</strong>해줌</li>
</ul>
<h4 id="단점-9">&lt;단점&gt;</h4>
<ul>
<li>기존 변수가 아닌 새로운 변수를 사용하여 <strong>해석하는 데 어려움</strong>이 있음</li>
<li>차원이 축소됨에 따라 <strong>정보 손실이 불가피</strong></li>
</ul>
<h4 id="예시-5">&lt;예시&gt;</h4>
<ul>
<li>다차원 변수들을 2차원 그래프로 표현하는 데 사용할 수 있음</li>
<li>변수가 너무 많아 모델 학습에 시간이 너무 오래 걸릴 때 (차원 축소를 진행하면 학습에 드는 시간을 줄일 수 있어) 유용</li>
<li>오버피팅을 방지하는 용도로 사용할 수도 있음</li>
</ul>
<p>📌 출처 ‣ <a href="https://yozm.wishket.com/magazine/detail/1931/">https://yozm.wishket.com/magazine/detail/1931/</a> </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코드카타] qr code]]></title>
            <link>https://velog.io/@seonyoung_3/%EC%BD%94%EB%93%9C%EC%B9%B4%ED%83%80-qr-code</link>
            <guid>https://velog.io/@seonyoung_3/%EC%BD%94%EB%93%9C%EC%B9%B4%ED%83%80-qr-code</guid>
            <pubDate>Fri, 16 Aug 2024 10:29:41 GMT</pubDate>
            <description><![CDATA[<h3 id="📁-문제">📁 문제</h3>
<p>두 정수 q, r과 문자열 code가 주어질 때, code의 각 인덱스를 q로 나누었을 때 나머지가 r인 위치의 문자를 앞에서부터 순서대로 이어 붙인 문자열을 return 하는 solution 함수를 작성해 주세요.</p>
<h3 id="📁-입출력-예">📁 입출력 예</h3>
<p><img src="https://velog.velcdn.com/images/seonyoung_3/post/55cfa71a-1a24-4620-8932-2ea0893db5ff/image.png" alt=""></p>
<h3 id="💡-내가-적은-오답">💡 내가 적은 오답</h3>
<pre><code class="language-python">def solution(q, r, code):
    answer = &#39;&#39;

    for i in code:
        if i % q == r:
            answer += [r+1]

    return answer</code></pre>
<ul>
<li>r인 위치의 문자를 앞을 꺼내오는 방법을 내 머리에서 생각할 수 있는 최선이 r+1...</li>
<li>역시나 틀렸었고, 예전에 이와 비슷한 문제를 풀 때 사용했던 것이 있었던 것 같아 찾아보았음</li>
</ul>
<h3 id="💡-나의-정답">💡 나의 정답</h3>
<pre><code class="language-python">def solution(q, r, code):
    answer = &#39;&#39;

    for i, char in enumerate(code):
        if i % q == r:
            answer += char

    return answer</code></pre>
<ul>
<li><code>char</code> : 문자열 code의 각 문자(현재 인덱스 i에 위치한 문자)
→ char의 역할 : 현재 인덱스에서 code 문자열의 특정 문자를 참조하는 것</li>
<li><code>i</code> : 문자 char의 인덱스</li>
<li><code>enumerate</code> : code의 각 문자와 해당 문자의 인덱스를 함께 반환</li>
</ul>
<h3 id="💡인상-깊었던-다른-정답">💡인상 깊었던 다른 정답</h3>
<pre><code class="language-python">def solution(q, r, code):
    return code[r::q]</code></pre>
<ul>
<li><code>code[r::q]</code> : 인덱스 r에서 시작하여 매 q번째 인덱스의 문자를 추출</li>
<li>나머지가 r인 인덱스를 정확히 선택하기 때문에 문제의 요구사항을 만족</li>
<li>q로 나눈 나머지가 r인 위치의 문자를 추출하는 방식과 일치</li>
</ul>
<p>→ 진짜 미친 것 같다.. 어떻게 이런 방식을 생각할까..? 나는 언제쯤 자연스레 이렇게 생각할까?😂</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코드카타] 접두사인지 확인하기]]></title>
            <link>https://velog.io/@seonyoung_3/%EC%BD%94%EB%93%9C%EC%B9%B4%ED%83%80-%EC%A0%91%EB%91%90%EC%82%AC%EC%9D%B8%EC%A7%80-%ED%99%95%EC%9D%B8%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@seonyoung_3/%EC%BD%94%EB%93%9C%EC%B9%B4%ED%83%80-%EC%A0%91%EB%91%90%EC%82%AC%EC%9D%B8%EC%A7%80-%ED%99%95%EC%9D%B8%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 14 Aug 2024 10:04:32 GMT</pubDate>
            <description><![CDATA[<h3 id="📁-문제">📁 문제</h3>
<p>어떤 문자열에 대해서 접두사는 특정 인덱스까지의 문자열을 의미합니다. 예를 들어, &quot;banana&quot;의 모든 접두사는 &quot;b&quot;, &quot;ba&quot;, &quot;ban&quot;, &quot;bana&quot;, &quot;banan&quot;, &quot;banana&quot;입니다.
문자열 my_string과 is_prefix가 주어질 때, is_prefix가 my_string의 접두사라면 1을, 아니면 0을 return 하는 solution 함수를 작성해 주세요.</p>
<h3 id="📁-입출력-예">📁 입출력 예</h3>
<p><img src="https://velog.velcdn.com/images/seonyoung_3/post/5f04d38c-308e-41ff-9543-f7c238d36cad/image.png" alt=""></p>
<h3 id="💡-내가-적은-오답">💡 내가 적은 오답</h3>
<pre><code class="language-python">def solution(my_string, is_prefix):
    return 1 if my_string in is_prefix else 0</code></pre>
<p><img src="https://velog.velcdn.com/images/seonyoung_3/post/a8610084-3d73-4f7c-a3e2-b6fc170ce565/image.png" alt=""></p>
<ul>
<li>일부만 정답으로 나옴</li>
</ul>
<h3 id="💡-내가-적은-정답">💡 내가 적은 정답</h3>
<pre><code class="language-python">def solution(my_string, is_prefix):
    if my_string.startswith(is_prefix):
        return 1
    else:
        return 0</code></pre>
<ul>
<li>위에 적은 코드 외에 다양하게 시도를 해보았지만 답이 나오지 않았음</li>
<li>python에 내가 원하는 문자열이 특정 문자로 시작하는지 알 수 있는 메서드가 있을 것 같아 찾아 보았음</li>
<li><code>startswith 메서드</code>를 발견하였음
→ 이는 문자열 메서드로, 문자열이 특정 접두사로 시작하는지 확인함 (시작하면 True, 그렇지 않으면 False를 반환함)</li>
</ul>
<h3 id="💡-그-외-정답">💡 그 외 정답</h3>
<pre><code class="language-python">def solution(my_string, is_prefix):
    return 1 if my_string.find(is_prefix) == 0 else 0</code></pre>
<ul>
<li><code>find 메서드</code> : is_prefix가 my_string의 맨 앞에서 시작하면 0을 반환하고, 그렇지 않으면 -1을 반환함
→ 따라서 my_string.find(is_prefix) == 0가 참이면 (즉, is_prefix가 my_string의 맨 앞에 있을 경우) 1을 반환하며, 그렇지 않으면 (즉, is_prefix가 my_string의 맨 앞에 없을 경우) 0을 반환</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[머신러닝] 선형회귀, 다중선형회귀]]></title>
            <link>https://velog.io/@seonyoung_3/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EC%84%A0%ED%98%95%ED%9A%8C%EA%B7%80</link>
            <guid>https://velog.io/@seonyoung_3/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EC%84%A0%ED%98%95%ED%9A%8C%EA%B7%80</guid>
            <pubDate>Tue, 13 Aug 2024 10:49:59 GMT</pubDate>
            <description><![CDATA[<h3 id="📁-선형회귀">📁 선형회귀</h3>
<h4 id="선형회귀-용어-정리">&lt;선형회귀 용어 정리&gt;</h4>
<ul>
<li><p><strong>공통</strong></p>
<ul>
<li>Y는 종속 변수, 결과 변수</li>
<li>X는 독립 변수, 원인 변수, 설명 변수</li>
</ul>
</li>
<li><p><strong>통계학에서 사용하는 선형회귀 식</strong></p>
<p>  $$
  Y = \beta_0 + \beta_1X + \varepsilon
  $$</p>
<ul>
<li>$\beta_0$: 편향(Bias)</li>
<li>$\beta_1$: 회귀 계수</li>
<li>$\varepsilon$: 오차(에러), 모델이 설명하지 못하는 Y의 변동성</li>
</ul>
</li>
<li><p><strong>머신러닝/딥러닝에서 사용하는 선형회귀 식</strong></p>
<p>  $$
  Y = wX + b
  $$</p>
<ul>
<li>$w$: 가중치</li>
<li>b: 편향(Bias)</li>
</ul>
</li>
</ul>
<h4 id="📌-결국-두-수식이-전달하려고-하는-의미는-같음">📌 결국 두 수식이 전달하려고 하는 의미는 같음</h4>
<p>→ 회귀 계수 혹은 가중치를 값을 알면 X가 주어졌을 때 Y를 알 수 있다는 것</p>
<h3 id="📁-회귀분석-평가-지표">📁 회귀분석 평가 지표</h3>
<h4 id="회귀-평가지표---mse">&lt;회귀 평가지표 - MSE&gt;</h4>
<ul>
<li><strong>에러 정의방법</strong><ul>
<li>방법1) <code>에러 = 실제 데이터 - 예측 데이터</code> 로 정의하기</li>
<li>방법2) 에러를 제곱하여 모두 양수로 만들기, 다 합치기</li>
<li>방법3) 데이터만큼 나누기</li>
</ul>
</li>
<li><strong>에러 정의 방법 수식화</strong><ul>
<li>방법1) $\varepsilon = y_i - \hat{y_i}$</li>
<li>방법2) $\sum\limits_{i=1}^n (y_i - \hat{y_i})^2$</li>
<li>방법3) $\frac{\sum\limits_{i=1}^n (y_i - \hat{y_i})^2}{n}$</li>
</ul>
</li>
</ul>
<h4 id="📌-y값의-머리에-있는--표기를-hat이라고-하며-예측혹은-추정한-수치에-표기">📌 y값의 머리에 있는 ^ 표기를 hat이라고 하며, 예측(혹은 추정)한 수치에 표기</h4>
<p>→ 수식 전체를 보면 이해하기 힘들 수 있지만, 단계별로 확인해보면 어렵지 않음</p>
<ul>
<li><strong>Mean Squared Erorr(MSE)라고 정의</strong>
$$
MSE = \frac{\sum\limits_{i=1}^n (y_i - \hat{y_i})^2}{n}
$$</li>
</ul>
<h4 id="선형회귀만의--평가-지표---r-square">&lt;선형회귀만의  평가 지표 - R Square&gt;</h4>
<ul>
<li><p>숫자를 예측하는 회귀분석에서 선형회귀에서만 평가되는 지표가 1개 더 있으며, 바로 R Square 지표임</p>
</li>
<li><p><code>R Square</code> : 전체 모형에서 회귀선으로 설명할 수 있는 정도</p>
</li>
<li><p>어떤 값을 “예측”한다는건 어림짐작으로 평균값보단 예측을 잘해야한다는 것을 의미</p>
</li>
<li><p><strong>기초 용어</strong></p>
<ul>
<li>$y_{i}$: 특정 데이터의 실제 값</li>
<li>$\bar{y}$: 평균 값</li>
<li>$\hat{y}$: 예측, 추정한 값
<img src="https://velog.velcdn.com/images/seonyoung_3/post/07983304-82d8-4f25-a0fe-ba5afc67c961/image.png" alt=""></li>
</ul>
</li>
<li><p><strong>R Square의 정의</strong>
$$
R^2 = \frac{SSR}{SST} = \frac{SSR}{SSR+SSE}
$$
<img src="https://velog.velcdn.com/images/seonyoung_3/post/3e0557f9-2278-4738-af7e-c15d1d1d9830/image.png" alt=""></p>
</li>
<li><p>3번의 데이터 값은 SST = 174^2, SSR = 169^2</p>
<ul>
<li>해당 값에 대한 설명력 = 94%</li>
<li>단, 모든 데이터에 대해서 위 계산을 수행</li>
</ul>
</li>
</ul>
<h4 id="📌-앞으로-만나는-숫자-예측-문제는-모델을-머신러닝이든-딥러닝이든-어떤-모델을-만들어도-위-mse-지표를-최소화하는-방향으로-진행하고-평가하게-됨">📌 앞으로 만나는 숫자 <strong>예측 문제는 모델을 머신러닝이든 딥러닝이든 어떤 모델을 만들어도 위 MSE 지표를 최소화하는 방향으로 진행하고 평가</strong>하게 됨</h4>
<ul>
<li><p><strong>기타 평가 지표</strong></p>
<ul>
<li><p><code>RMSE</code>: MSE에 Root를 씌워 제곱 된 단위를 다시 맞추기</p>
<p>  $$
  RMSE = \sqrt{\frac{\sum\limits_{i=1}^n (y_i - \hat{y_i})^2}{n}}
  $$</p>
</li>
<li><p><code>MAE</code>: 절대 값을 이용하여 오차 계산하기</p>
<p>$$
MAE = \frac{1}{n}\sum\limits_{i=1}^n{\left\vert y_i - \hat{y_i} \right\vert}
$$</p>
</li>
</ul>
</li>
</ul>
<h4 id="python-이용시-자주-쓰는-함수">&lt;python 이용시 자주 쓰는 함수&gt;</h4>
<ul>
<li><code>sklearn.linear_model.LinearRegression</code> : 선형회귀 모델 클래스<ul>
<li><code>coef_</code> : 회귀 계수</li>
<li><code>intercept</code> : 편향(bias)</li>
<li><code>fit</code> : 데이터 학습</li>
<li><code>predict</code> : 데이터 예측</li>
</ul>
</li>
</ul>
<h3 id="📁-다중선형회귀">📁 다중선형회귀</h3>
<ul>
<li>X와 Y간의 데이터에서 아주 간단한 단순회귀분석만 있는 것이 아니라 실제의 데이터들은 비선형적 관계를 가지는 경우가 많음</li>
<li>이를 위해서 X변수를 추가 할 수도, 변형할 수 도 있음</li>
</ul>
<h4 id="단순선형회귀--vs-다항회귀">&lt;단순선형회귀  vs 다항회귀&gt;</h4>
<p><img src="https://velog.velcdn.com/images/seonyoung_3/post/b606ddf2-7d03-46f9-ba72-804e388efd9f/image.png" alt=""></p>
<h4 id="수치형-데이터-vs-범주형-데이터">&lt;수치형 데이터 vs 범주형 데이터&gt;</h4>
<p><img src="https://velog.velcdn.com/images/seonyoung_3/post/ce400bb5-db96-40a0-9638-dc645daf0c9e/image.png" alt=""></p>
<ul>
<li><p><strong>수치형 데이터</strong></p>
<ul>
<li><p><strong>연속형 데이터</strong> : 두 개의 값이 무한한 개수로 나누어진 데이터</p>
<p>  ex) 키, 몸무게</p>
</li>
<li><p><strong>이산형 데이터</strong> :  두 개의 값이 유한한 개수로 나누어진 데이터  </p>
<p>  ex) 주사위 눈, 나이</p>
</li>
</ul>
</li>
<li><p><strong>범주형 데이터</strong></p>
<ul>
<li><p><strong>순서형 자료</strong> : 자료의 순서 의미가 있음</p>
<p>  ex) 학점,등급</p>
</li>
<li><p><strong>명목형 자료</strong> : 자료의 순서 의미가 없음</p>
<p>  ex) 혈액형, 성별</p>
</li>
</ul>
</li>
</ul>
<blockquote>
<h3 id="💡-정리">💡 정리</h3>
</blockquote>
<ul>
<li>머신러닝모델 중에 선형회귀는 이해하기 쉽고 방법도 쉬운 장점이 있지만 말 그대로 <code>X-Y변수</code>간의 선형적 관계가 좋아아만 좋은 성능을 냄</li>
<li><em>↓*</em></li>
<li><em>1. 선형성 (Linearity)*</em> : 종속 변수(Y)와 독립 변수(X) 간에 <strong>선형 관계가 존재</strong>해야 함 
<img src="https://velog.velcdn.com/images/seonyoung_3/post/79a28e3b-26d5-4d24-b348-d86991e56981/image.png" alt=""></li>
<li><em>2. 등분산성 (Homoscedasticity)*</em> : 오차의 분산이 <strong>모든 수준의 독립 변수에 대해 일정</strong>해야 함<ul>
<li>즉, 오차가 특정 패턴을 보여서는 안 되며, <strong>독립 변수의 값에 상관없이 일정</strong>해야 함</li>
</ul>
</li>
<li><em>3. 정규성 (Normality)*</em> : 오차 항은 <strong>정규 분포를 따라야 함</strong></li>
<li><em>4. 독립성 (Independence)*</em> : X변수는 <strong>서로 독립적</strong>이어야 함</li>
</ul>
<h4 id="다중공선성-문제">&lt;다중공선성 문제&gt;</h4>
<ul>
<li>변수가 많아지면 서로 연관이 있는 경우가 많음</li>
<li>이처럼 회귀분석에서 독립변수(X)간의 <strong>강한 상관관계</strong>가 나타나는 것을 <strong>다중공선성(Multicolinearity)문제</strong>라고 함</li>
</ul>
<h4 id="다중공선성-해결방법">&lt;다중공선성 해결방법&gt;</h4>
<ul>
<li>서로 상관관계가 높은 변수 중 하나만 선택(산점도 혹은 상관관계 행렬)</li>
<li>두 변수를 동시에 설명하는 차원축소(Principle Component Analysis, PCA) 실행하여 변수 1개로 축소</li>
</ul>
<h4 id="선형-회귀-정리">&lt;선형 회귀 정리&gt;</h4>
<ul>
<li><strong>장점</strong><ul>
<li>직관적이며 이해하기 쉬움(X-Y관계를 정량화 할 수 있음)</li>
<li>모델이 빠르게 학습됨(가중치 계산이 빠름)</li>
</ul>
</li>
<li><strong>단점</strong><ul>
<li>X-Y간의 선형성 가정이 필요</li>
<li>평가지표가 평균(mean)포함 하기에 이상치에 민감</li>
<li>범주형 변수를 인코딩시 정보 손실이 일어남</li>
</ul>
</li>
<li><strong>Python 패키지</strong><ul>
<li><code>sklearn.linear_model.LinearRegression</code></li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코드카타] 카운트 업]]></title>
            <link>https://velog.io/@seonyoung_3/%EC%BD%94%EB%93%9C%EC%B9%B4%ED%83%80-%EC%B9%B4%EC%9A%B4%ED%8A%B8-%EC%97%85</link>
            <guid>https://velog.io/@seonyoung_3/%EC%BD%94%EB%93%9C%EC%B9%B4%ED%83%80-%EC%B9%B4%EC%9A%B4%ED%8A%B8-%EC%97%85</guid>
            <pubDate>Mon, 12 Aug 2024 11:00:43 GMT</pubDate>
            <description><![CDATA[<h3 id="📁-문제">📁 문제</h3>
<p>정수 start_num와 end_num가 주어질 때, start_num부터 end_num까지의 숫자를 차례로 담은 리스트를 return하도록 solution 함수를 완성해주세요.</p>
<h3 id="📁-입출력-예">📁 입출력 예</h3>
<p><img src="https://velog.velcdn.com/images/seonyoung_3/post/7ea0c555-1d3e-4d74-870a-acc76fc9faed/image.png" alt=""></p>
<h3 id="💡-내가-푼-정답">💡 내가 푼 정답</h3>
<pre><code class="language-python">def solution(start, end):
    answer = []
    for i in range(start,end+1):
        answer.append(i)
    return answer</code></pre>
<ul>
<li>문제를 풀고 나서 무언가 더 간단한 정답이 있을 것 같아서 찾아보니 아니나 다를까 완전 초간단 풀이가 있는 것을 발견</li>
</ul>
<h3 id="💡-초간단-풀이">💡 초간단 풀이</h3>
<pre><code class="language-python">def solution(start, end):
    return list(range(start, end + 1))</code></pre>
<ul>
<li><code>range(start, end + 1)</code> : 파이썬의 range 함수를 사용하여 숫자의 시퀀스를 생성</li>
<li><code>range(start, end + 1)</code> : start에서 시작하여 end까지 포함하는 범위를 생성<ul>
<li><code>end + 1</code>을 사용하는 이유 : range 함수는 끝값을 포함하지 않기 때문에 end를 포함하기 위해 end + 1을 설정</li>
</ul>
</li>
<li><code>list(range(start, end + 1))</code> : 이 range 객체를 리스트로 변환<ul>
<li>range 객체는 반복 가능한 객체로, 리스트로 변환하면 실제로 저장된 숫자들을 확인할 수 있음
→ 결과적으로, 이 표현식은 start부터 end까지의 모든 정수를 포함하는 리스트를 반환</li>
</ul>
</li>
</ul>
<blockquote>
<h4 id="📌-나의-생각">📌 나의 생각</h4>
</blockquote>
<ul>
<li>이렇게 간단한 풀이를 언제쯤 생각해서 풀까라는 생각을 하게 되었습니다.</li>
<li>또한, 이러한 생각을 실천하기 위해서는 다양한 코드카타를 많이 접하고 풀어봐야겠다는 생각을 다시 한번 하게 되었습니다.</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>