<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>kyejin0412 님의 블로그</title>
    <link>https://kyejin0412.tistory.com/</link>
    <description>kyejin0412 님의 블로그 입니다.</description>
    <language>ko</language>
    <pubDate>Thu, 4 Jun 2026 16:40:52 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>kyejin0412</managingEditor>
    <item>
      <title>당근페이 라이브톡 #2 어쩌다 결제 도메인에서 이런 것들을 만들었을까?</title>
      <link>https://kyejin0412.tistory.com/81</link>
      <description>&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;p data-ke-size=&quot;size16&quot;&gt;택배 TF를 하면서 그로스까지 성공하고, 중고거래팀과 힘을 합쳐서 원팀으로 일했다.&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 메이커는 불편해야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 직접 사용자입장을 겪어보면서 페인포인트를 찾고, 과정을 경험하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 리얼월드에서 발생할 수 있는 변수들에 대응하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 행안부 지도 api를 사용하기 때문에 행안부 데이터센터에 불이 났을 때 서비스가 멈춰버렸다. 이후 이중으로 대비하게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 페인포인트 : 사기꾼, 반택 개인정보 보호 (택배예약)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 안심결제 + 택배예약 -&amp;gt; 바로구매 (사기꾼 방지, 편리성)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. 택배예약할 때 어쩔 수 없이 정보 입력 단계가 늘어나서 이탈이 여기서 늘어났던 것 같다. 이탈을 줄이기 위해 데이터를 열심히 봤었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. 유저보이스를 듣고, 데이터 분석하고, 퍼널을 부셨다. 그 결과가 숫자가 눈으로 보였고 사용자 반응이 너무 좋았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9. 전국 오픈한 이후로 대시보드의 모든 지표가 올라가고 있다. 출근하자마자 대시보드를 확인한다. -&amp;gt; 데이터 분석가로서 대시보드를 보는 사람과 필요성에 맞게 설계하는 것의 중요성을 느꼈다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10. 팀 분위기 : 팀원간 신뢰가 있으니 충돌도 있는 것이다. 팀원이 중요하다. 중고거래결제팀이 소수 정예팀이라 일당백을 해야 한다. 각자 업무 영역을 나누지 않고 업무의 경계 없이 일을 한다. 모두가 PM, 개발자, 디자이너, 데이터 분석가다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;11. 지금까지는 사용자가 겪는 불편함을 위주로 개발해왔다. 다음 목표는 디테일까지 챙겨서 완성도 있는 서비스를 만드는 것이다.&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;12. 신사업을 하게 될 때, 비즈니스적으로 달성 목표와 사용자의 니즈의 밸런스를 잘 잡아야 한다. 밸런스 지점을 조율해나가며 발전시켜야 한다. 감에만 의존하지 않고 데이터 기반 근거있는 판단을 하려고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;13. 당근에서는 원래 비대면 거래를 장려하지 않았다. 따라서 주의 메세지를 띄웠었는데 이 메세지가 많아지다 보니 많은 사람들이 비대면 거래를 한다는 것을 알게 되었다. 직감과 직감을 증명해낼 명확한 데이터를 바탕으로 니즈를 파악하고 비대면 거래도 발전시키게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;14. 당근은 충돌을 긍정적으로 생각하고, 근거만 있다면 누구든 목소리를 낼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;15. 프로덕트의 성공과 실패기준 : 사업적인 목표를 이뤘는지? 단/중/장기 목표를 세웠다. 사용자가 애정을 갖고 사용하는지. 건강한 사용자 경험이 되고 있는가.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;16. 이탈 구간을 매일매일 확인하고 있다. 주의깊게 봐야 하는 이슈인지, 당연하게 발생하는 이슈인지 구분을 하는게 가장 중요하다. 점점 무시하고 넘어가는 이슈가 많아졌던 것 같다. 구분이 잘 안되면 모니터링을 하는 의미가 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;17. 당근의 기본철학이 동네에서 직거래하는 것이다. 우리의 철학과 맞으며, 유저가 원하는 방향인가가 중요하다. 바로구매는 이 둘이 충족하는 것 같아서 시험적으로 시작한 서비스이다.&lt;/p&gt;</description>
      <author>kyejin0412</author>
      <guid isPermaLink="true">https://kyejin0412.tistory.com/81</guid>
      <comments>https://kyejin0412.tistory.com/81#entry81comment</comments>
      <pubDate>Tue, 31 Mar 2026 20:05:30 +0900</pubDate>
    </item>
    <item>
      <title>[BDAI] 원데이 클래스 - SQL 기반 KPI 설정</title>
      <link>https://kyejin0412.tistory.com/80</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;IT 인프라 환경 종류&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #0a0a0a; text-align: start;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAEIAxAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot;&gt;&lt;span data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;개발계&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;= 개발 환경 (Dev Environment)&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAEIAxAB&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot;&gt;&lt;span data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;운영계&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;= 운영 환경 (Prod Environment)&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAEIAxAC&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot;&gt;&lt;span data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;분석계&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;= 분석 환경 (Analytics/Data Environment)&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAEIAxAC&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot;&gt;&lt;span data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;예시&lt;/span&gt;&lt;span data-complete=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;/span&gt;&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;853&quot; data-origin-height=&quot;393&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZkIPo/dJMcadVIv6S/wzkBzBNRANVcZ9UFS1sfLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZkIPo/dJMcadVIv6S/wzkBzBNRANVcZ9UFS1sfLk/img.png&quot; data-alt=&quot;금용 도메인 예시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZkIPo/dJMcadVIv6S/wzkBzBNRANVcZ9UFS1sfLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZkIPo%2FdJMcadVIv6S%2FwzkBzBNRANVcZ9UFS1sfLk%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;677&quot; height=&quot;312&quot; data-origin-width=&quot;853&quot; data-origin-height=&quot;393&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;금용 도메인 예시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;855&quot; data-origin-height=&quot;626&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Bp5qq/dJMcacJlfNQ/6ikTScNvkpcOMzGoSQb6dk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Bp5qq/dJMcacJlfNQ/6ikTScNvkpcOMzGoSQb6dk/img.png&quot; data-alt=&quot;커머스 도메인 예시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Bp5qq/dJMcacJlfNQ/6ikTScNvkpcOMzGoSQb6dk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBp5qq%2FdJMcacJlfNQ%2F6ikTScNvkpcOMzGoSQb6dk%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;686&quot; height=&quot;502&quot; data-origin-width=&quot;855&quot; data-origin-height=&quot;626&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;커머스 도메인 예시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;KPI 지표 설정 방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. KPI 개념&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;KPI 지표 : 서비스에 관련된 모든 이해관계자들이 &lt;span style=&quot;color: #ee2323;&quot;&gt;정량적으로&lt;/span&gt; 높이고 싶은 공통 목표. 달성하면 좋은 것들.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7; text-align: start;&quot;&gt; 분석가로서 궁금한 내용이 아님!! &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제너럴하고 정량적인 지표로 설정해야 함. (정성적 지표 X)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;지표가 늘어난다 = 서비스가 더 발전한다, 좋아진다&lt;/span&gt; 로 이어져야 함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;KPI를 보고 업무의 우선순위도 알 수 있고, 어떤 걸 발전시켜야 하는지 알 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;구체적이고 정량적이어야하고, 기간이 필요하거나 용어의 정의가 중요하다.&lt;/span&gt;&lt;/p&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;span style=&quot;color: #ee2323;&quot;&gt;왜 이 KPI를 달성해야 하는지 &lt;b&gt;근거&lt;/b&gt;가 필요함. &lt;span style=&quot;color: #333333;&quot;&gt;그래야 사람들이 납득하고 달성하고자 노력하고 움직일 수 있음.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;인과관계가 &lt;span style=&quot;color: #ee2323;&quot;&gt;데이터로 입증&lt;/span&gt;이 되어야 하고 근거, 비즈니스 로직이 탄탄해야 한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;내 주관이나 추측, 당연히 그렇겠지~ 가 들어가면 안됨!&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;2. 도메인과 상황 고려&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;도메인과 해당 기업의 상황에 맞는 KPI를 설정해야함.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;예를 들어, 매출 증가율은 매출이 증가할 상황에 놓여있는 기업에서 설정해야 함.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;카카오톡은 이미 전국민이 쓰고 있어서 매출 증가 혹은 고객 증가가 KPI로 설정되기는 적합하지 않음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;신규보다는 리텐션을 보는 것이 적합할 것임.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AARRR을 기반으로 설정하는 거 추천.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 음악 서비스로 들어보는 예시&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) 음악 서비스 KPI 좋은 사례&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;li&gt;분기 당 매출 성장률&lt;/li&gt;
&lt;li&gt;신규 고객 획득 수(신규사업), 고객 유지율(기존사업) -&amp;gt; 이 둘은 동시에 가져가기는 어렵다. 도메인이나 상황에 맞는 KPI를 설정하는 것도 중요하다!&lt;/li&gt;
&lt;li&gt;전월 대비 인보이스 수량 증가율&lt;/li&gt;
&lt;li&gt;특정 기간동안의 유료 이용자 수&lt;/li&gt;
&lt;li&gt;헤비 유저 수, 라이트 유저 수&amp;nbsp;&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) 안 좋은 사례&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;유지고객 -&amp;gt; 유지고객의 정의가 필요함&lt;/li&gt;
&lt;li&gt;정성적 지표는 의미 없음&lt;/li&gt;
&lt;li&gt;재구매율 -&amp;gt; 음악 서비스에서 재구매라 하기가 애매함&lt;/li&gt;
&lt;li&gt;반복되는 고객 수 -&amp;gt; 어떤게 반복된다는 건지? 구매? 방문? 듣기? 용어의 정의를 구체적으로!&lt;/li&gt;
&lt;li&gt;곡을 구매한 고객들 중 특정 곡을 거래한 고객 비율 -&amp;gt; 분석가가 궁금한 내용&lt;/li&gt;
&lt;li&gt;구매한 고객 수 -&amp;gt; 헤비 유저와 라이트 유저가 똑같이 카운트 됨. 구체적으로 나눠야 함&lt;/li&gt;
&lt;li&gt;월별/연별 등 특정 주기의 수익 -&amp;gt; 이미 수익은 항상 트래킹 중이기 때문에 애매함&lt;/li&gt;
&lt;li&gt;거래가 활발한 시간대 혹은 기간 -&amp;gt; 분석가가 궁금한 내용&lt;/li&gt;
&lt;li&gt;객단가 최다 구간 -&amp;gt; 분석가가 궁금한 내용 &lt;br /&gt;장르별 매출 -&amp;gt; 분석가가 궁금한 내용&lt;/li&gt;
&lt;li&gt;신규 유입 고객수 -&amp;gt; 신규의 기준이 언제인지? 월별? 합리적인 신규 유입 기간을 설정해야 함&lt;/li&gt;
&lt;li&gt;재구매 주기 -&amp;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;span&gt;참고 용어&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;MAU (= monthly active user)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;WAU (= weekly active user)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>BDA</category>
      <author>kyejin0412</author>
      <guid isPermaLink="true">https://kyejin0412.tistory.com/80</guid>
      <comments>https://kyejin0412.tistory.com/80#entry80comment</comments>
      <pubDate>Sun, 29 Mar 2026 12:14:11 +0900</pubDate>
    </item>
    <item>
      <title>Week 21-5 내일배움캠프 수료식 및 수료 소감</title>
      <link>https://kyejin0412.tistory.com/79</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중간쯤에는 포기하고 싶었던 적도 있었다. 시간이 되게 안 간다고 느껴졌다.&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;/p&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;/p&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;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모두 서로의 인맥이 되고, 든든한 동료가 될 수 있도록 멋지게 취업했으면 좋겠다.&lt;/p&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;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 취준생들이여 화이팅!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;기회는&amp;nbsp;인생의&amp;nbsp;위기에 &lt;br /&gt;예술은&amp;nbsp;가끔의&amp;nbsp;실수에 &lt;br /&gt;길을&amp;nbsp;헤메던&amp;nbsp;발자국은&amp;nbsp;지도가&amp;nbsp;되고, &lt;br /&gt;불완전하게&amp;nbsp;어두워지는것을&amp;nbsp;반복하던&amp;nbsp;빛은&amp;nbsp;별이&amp;nbsp;된다. &lt;br /&gt;그렇게&amp;nbsp;인생은&amp;nbsp;지나고보면&amp;nbsp;휘황찬란한&amp;nbsp;별밭이었다.&lt;br /&gt;- 허진성 튜터님 공유글&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;651&quot; data-origin-height=&quot;388&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dQBTxM/dJMcahRbjkm/zekfd6bWI3R5E0JRzRG0b0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dQBTxM/dJMcahRbjkm/zekfd6bWI3R5E0JRzRG0b0/img.png&quot; data-alt=&quot;우리 졸업했어요!!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dQBTxM/dJMcahRbjkm/zekfd6bWI3R5E0JRzRG0b0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdQBTxM%2FdJMcahRbjkm%2Fzekfd6bWI3R5E0JRzRG0b0%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;651&quot; height=&quot;388&quot; data-origin-width=&quot;651&quot; data-origin-height=&quot;388&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;우리 졸업했어요!!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>내일배움캠프-데이터분석</category>
      <author>kyejin0412</author>
      <guid isPermaLink="true">https://kyejin0412.tistory.com/79</guid>
      <comments>https://kyejin0412.tistory.com/79#entry79comment</comments>
      <pubDate>Fri, 13 Mar 2026 19:00:54 +0900</pubDate>
    </item>
    <item>
      <title>Week 21-4 최종프로젝트 - 발표 피드백, 이력서 작성 세션</title>
      <link>https://kyejin0412.tistory.com/78</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;우리팀 피드백&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;키워드분석에서 그치지 않고 점수로 모델 설계한게 의미가 있었다.&lt;br /&gt;문제정의와 전략제안까지 구조가 좋았다.&lt;br /&gt;실무적으로 많이 하고 있는 작업이니까 마케팅 데이터 분석할 때 도움이 될 것 같다.&lt;/p&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;b&gt;면접 예상질문&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #27262e; text-align: start;&quot;&gt;- 리스크를 하나의 범주로 묶지 않고, 평판 리스크/운영 리스크/품질 리스크로 나누지 않은 이유는 무엇인가요? &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #27262e; text-align: start;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #27262e; text-align: start;&quot;&gt;- threshold 0.45를 최종 선택했을 때, 실제 운영 환경에서 감수하려는 오탐과 미탐의 기준은 무엇인가요? precision-recall은 threshold에 따라 달라지므로 그 기준 설명이 중요합니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #27262e; text-align: start;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #27262e; text-align: start;&quot;&gt;- 최종 리스크 점수의 가중치(0.5, 0.3, 0.2)는 어떤 실험이나 근거를 바탕으로 설정했나요? 확률 점수가 실제 위험도로 해석 가능한지 calibration 관점에서 점검해봤는지도 궁금합니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #27262e; text-align: start;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #27262e; text-align: start;&quot;&gt;- 댓글 비율/좋아요&amp;middot;조회수를 포함한 확산 점수를 조기 탐지와 어떻게 구분해 해석하셨나요? 초기에 잡는 신호와 이미 확산된 신호를 분리해 설명할 수 있나요? &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #27262e; text-align: start;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #27262e; text-align: start;&quot;&gt;- 가격 인상 이후 웨이팅&amp;middot;재고 부족이 따라오는 패턴을 보여주셨는데, 이를 단순 동시 발생이 아니라 시간에 따른 토픽 변화로 더 엄밀히 검증한다면 어떤 방식으로 확장할 수 있을까요? BERTopic도 topic evolution을 시간축으로 보는 기능을 안내하고 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;b&gt;타팀 피드백&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제정의&amp;nbsp;-&amp;gt;&amp;nbsp;액션까지&amp;nbsp;흘러가는&amp;nbsp;스토리가&amp;nbsp;자연스럽게&amp;nbsp;이어져서&amp;nbsp;좋았다.&lt;br /&gt;AI&amp;nbsp;Agent&amp;nbsp;로&amp;nbsp;팀원수&amp;nbsp;부족을&amp;nbsp;극복했던게&amp;nbsp;기특하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공공데이터&amp;nbsp;수집을&amp;nbsp;훌륭하게&amp;nbsp;해냈다.&amp;nbsp;지도로도&amp;nbsp;잘했다.&lt;br /&gt;많이&amp;nbsp;고민한&amp;nbsp;흔적이&amp;nbsp;보였다,&amp;nbsp;전처리,&amp;nbsp;모델링,&amp;nbsp;파라미터&amp;nbsp;튜닝도&amp;nbsp;잘&amp;nbsp;되었다.&lt;br /&gt;근데&amp;nbsp;대시보드가&amp;nbsp;아쉽다.&amp;nbsp;알맹이는&amp;nbsp;좋은데&amp;nbsp;포장을&amp;nbsp;잘&amp;nbsp;못했다.&lt;br /&gt;포폴은&amp;nbsp;모델을&amp;nbsp;어떻게&amp;nbsp;만들었고&amp;nbsp;이런걸&amp;nbsp;보는게&amp;nbsp;아니라&amp;nbsp;대시보드를&amp;nbsp;본다.&lt;/p&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;/p&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;그 후에 eda를 어펜딕스로 빼라.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;b&gt;바로인턴 정보&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;24기 바로인턴 : 3/16 - 3/24 모집, 4/13~ 근무 시작&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매칭 포기해도 n차 매칭을 해주는데 안되면 다음 기수에 참여가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이력서 pass 한 사람 우대&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;25기 : 3/25 - 4/24 모집, 5/11~ 근무 시작&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>kyejin0412</author>
      <guid isPermaLink="true">https://kyejin0412.tistory.com/78</guid>
      <comments>https://kyejin0412.tistory.com/78#entry78comment</comments>
      <pubDate>Thu, 12 Mar 2026 21:48:15 +0900</pubDate>
    </item>
    <item>
      <title>Week 20-5 최종프로젝트 - BERT 리스크/비리스크 분류 모델</title>
      <link>https://kyejin0412.tistory.com/77</link>
      <description>&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;라벨링 데이터에서 부정(0), 중립부정(1) -&amp;gt; 리스크(1) / 중립(2), 긍정(3) -&amp;gt; 비리스크(0) 로 다시 라벨링하여 학습시켰다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터가 1000개 정도로 늘어나 안정적인 수치의 모델을 만들 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;머신러닝/딥러닝에서 데이터의 개수가 많을수록 좋다는 것을 체감했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 BERT 모델을 만들면서 배운점을 기술하고자 한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&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;klue/bert-base : 한국어 성능이 안정적임 -&amp;gt; 결과가 더 좋았음.&lt;/li&gt;
&lt;li&gt;beomi/KcELECTRA-base : 네이버 댓글 + 커뮤니티 데이터 학습된 모델 -&amp;gt; 시크먼트 카페 데이터이므로 사용해봄.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;식별자 컬럼 살리기&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;타브랜드 필터링 bert 모델을 만들 때, 학습데이터에서 식별자 컬럼(ID)을 없앤 적이 있었다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;나중에 전체데이터에서 학습데이터를 빼고 모델을 적용시키려는데, 학습데이터의 식별자 컬럼이 없어서 전체데이터에서 골라낼 수가 없었다...&lt;span&gt;&amp;nbsp;&lt;/span&gt;바보같은 실수였다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;식별자 컬럼은 웬만하면 살려두자!&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Hugging Face Datasets&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자연어 처리(NLP), 컴퓨터 비전, 오디오 등 AI 모델 학습에 필요한 대규모 데이터를 쉽게 찾고, 다운로드하고, 전처리하여 사용할 수 있도록 해주는&amp;nbsp;오픈 소스 플랫폼이자 데이터 관리 라이브러리&lt;/li&gt;
&lt;li&gt;&lt;span data-processed=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;방대한 공개 데이터셋&lt;/b&gt;: 수천 개 이상의 데이터셋(텍스트, 이미지, 오디오 등)이 등록되어 있어, 원하는 데이터를 쉽게 검색하고 사용할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span data-processed=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;원라인 로딩 (One-line Loading)&lt;/b&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;load_dataset(&quot;dataset_name&quot;)&lt;span&gt;&amp;nbsp;&lt;/span&gt;명령 하나로 데이터를 로드하여 바로 모델 학습에 사용할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span data-processed=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;효율적인 메모리 관리&lt;/b&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Apache Arrow&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;형식을 기반으로 하여, RAM 크기 제한을 받지 않고 대용량 데이터도 빠르게 처리(Memory-mapped)할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span data-processed=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;전처리 기능 (Preprocessing)&lt;/b&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;dataset.map()을 사용하여 데이터를 쉽게 가공, 필터링, 분할(split)할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span data-processed=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;프레임워크 연동성&lt;/b&gt;: PyTorch, TensorFlow, JAX, Pandas, NumPy 등 다양한 머신러닝 프레임워크와 완벽하게 호환된다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span data-processed=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;스트리밍 모드&lt;/b&gt;: 데이터를 로컬에 모두 다운로드하지 않고도 스트리밍(Streaming) 방식으로 학습을 시작할 수 있어 디스크 공간을 절약할 수 있다.&lt;/span&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;역비중 (class-weights) - 클래스 불균형 처리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 불균형이 있을 때 아주 중요한 처리이다.&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;/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;Threshold Grid Search&lt;/h3&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;threshold를 범위를 정해서 for문을 돌려 최적의 threshold를 찾는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 반복문으로 best threshold를 찾는 건데 이름이 거창해보인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;PR-AUC (Precision-Recall Area-Under-Curve) 그래프&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;임계값에 따른 Precision-Recall curve를 나타낸다. (임계값은 0 ~ 1 사이의 확률값을 가진다.)&lt;/li&gt;
&lt;li&gt;AUC는 그래프의 곡선 아래 면적을 의미한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;임계값이 0에 가까울수록 Recall은 높아지지만, 0의 오차 건수가 동시에 많아지므로 Precision은 낮아진다.&lt;/li&gt;
&lt;li&gt;반대로 임계값이 1에 가까워지면 Recall은 낮아지지만, Precision은 높아진다.&lt;/li&gt;
&lt;li&gt;이처럼 두 지표의 상충관계에 의해 그래프는 감소하는 형태를 띄게 된다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;567&quot; data-origin-height=&quot;455&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OAOxN/dJMcaf6OPPd/FxPuTNY45ym8SM33VueWEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OAOxN/dJMcaf6OPPd/FxPuTNY45ym8SM33VueWEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OAOxN/dJMcaf6OPPd/FxPuTNY45ym8SM33VueWEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOAOxN%2FdJMcaf6OPPd%2FFxPuTNY45ym8SM33VueWEK%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;567&quot; height=&quot;455&quot; data-origin-width=&quot;567&quot; data-origin-height=&quot;455&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;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;불균형 기준, 대략적인 PR-AUC해석&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 81.8605%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 37.4419%;&quot;&gt;0.5 이하&lt;/td&gt;
&lt;td style=&quot;width: 44.3023%;&quot;&gt;거의 못 잡는 모델&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 37.4419%;&quot;&gt;0.6 ~ 0.7&lt;/td&gt;
&lt;td style=&quot;width: 44.3023%;&quot;&gt;baseline 수준&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 37.4419%;&quot;&gt;&lt;b&gt;0.7 ~ 0.8&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 44.3023%;&quot;&gt;&lt;b&gt;실무 사용 가능&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 37.4419%;&quot;&gt;0.8 ~ 0.9&lt;/td&gt;
&lt;td style=&quot;width: 44.3023%;&quot;&gt;좋은 모델&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 37.4419%;&quot;&gt;0.9+&lt;/td&gt;
&lt;td style=&quot;width: 44.3023%;&quot;&gt;매우 강력&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;F-Beta Score&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;799&quot; data-origin-height=&quot;488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwkol1/dJMcahcuElX/6VvsCLZKNW5C3EZuwk1DpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwkol1/dJMcahcuElX/6VvsCLZKNW5C3EZuwk1DpK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwkol1/dJMcahcuElX/6VvsCLZKNW5C3EZuwk1DpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbwkol1%2FdJMcahcuElX%2F6VvsCLZKNW5C3EZuwk1DpK%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;661&quot; height=&quot;488&quot; data-origin-width=&quot;799&quot; data-origin-height=&quot;488&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;p data-ke-size=&quot;size16&quot;&gt;f1-score 뿐 아니라 f-beta score라는 것이 있다.&lt;/p&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;beta=1 : precision과 recall에 동일한 가중치를 부여한 조화평균&lt;/li&gt;
&lt;li&gt;beta &amp;gt; 1 : recall에 더 많은 가중치 부여 (FN 감소가 중요하다! 리스크를 더 많이 잡아내자)&lt;/li&gt;
&lt;li&gt;beta &amp;lt; 1 : precision에 더 많은 가중치 부여 (FP 감소가 중요하다! 잘못 예측하는 것이 위험하다)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리 주제는 리스크 조기탐지이므로, 리스크를 놓치는 게 더 치명적이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 FN의 감소가 중요하여, f2-score를 만들어서 성능을 비교했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;모델 평가 기준 (metric = 평가 지표)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;recall &amp;gt;= 0.8&lt;/li&gt;
&lt;li&gt;precision &amp;gt;= 0.55&lt;/li&gt;
&lt;li&gt;이 중 threshold, f2-score가 가장 높은 것&lt;/li&gt;
&lt;li&gt;precision을 아예 신경쓰지 않으면, FP가 높아지게 된다. 이를 사람이 모두 검토하기에는 부담이다.&lt;/li&gt;
&lt;li&gt;따라서 recall을 1순위로 확보하면서, precision을 너무 낮게 가져가지 않는다. f2-score 또한 확인해준다.&lt;/li&gt;
&lt;li&gt;리스크 탐지에서는 보통 threshold를 0.35~0.4로 낮춰서 리스크를 놓치지 않도록 민감하게 잡는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;참고로, 모델 비교 시에는 f2-score를 우선으로, threshold 선택시에는 recall을 우선으로 본다고 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;597&quot; data-origin-height=&quot;337&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YvtGK/dJMcagklEEm/iZX1tRmAQjidn7RqSmtus1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YvtGK/dJMcagklEEm/iZX1tRmAQjidn7RqSmtus1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YvtGK/dJMcagklEEm/iZX1tRmAQjidn7RqSmtus1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYvtGK%2FdJMcagklEEm%2FiZX1tRmAQjidn7RqSmtus1%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;597&quot; height=&quot;337&quot; data-origin-width=&quot;597&quot; data-origin-height=&quot;337&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;SEED 고정 필수&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-start=&quot;214&quot; data-end=&quot;248&quot; data-ke-size=&quot;size16&quot;&gt;BERT 학습에는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;랜덤 요소가 여러 개&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;들어 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-start=&quot;250&quot; data-end=&quot;255&quot; data-ke-size=&quot;size16&quot;&gt;대표적으로&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-start=&quot;257&quot; data-end=&quot;364&quot; data-ke-size=&quot;size16&quot;&gt;1️⃣&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;train / validation split 랜덤&lt;/b&gt;&lt;br /&gt;2️⃣&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;weight initialization&lt;/b&gt;&lt;br /&gt;3️⃣&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;dropout&lt;/b&gt;&lt;br /&gt;4️⃣&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;GPU 연산 비결정성&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-start=&quot;257&quot; data-end=&quot;364&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-start=&quot;257&quot; data-end=&quot;364&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;보통 seed = 42로 설정함&lt;/b&gt;&lt;/p&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;이는 seed 설정을 안해줬기 때문이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 랜덤요소가 매번 달라지기 때문에 당연한 결과였다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;seed를 보통 42로 설정하여 결과값이 달라지지 않게 한다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 BERT는 seed를 고정해도 약간씩 달라질 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이럴경우 보통 3번 정도 돌리고 평균 threshold로 설정하곤 한다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Confusion Matrix (혼동행렬)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;읽는 순서&lt;br /&gt;&lt;span&gt;[TN FP]&lt;/span&gt;&lt;br /&gt;&lt;span&gt;[FN TP]&lt;br /&gt;[72 54] &lt;br /&gt;&lt;/span&gt;[13 68]&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;TN&lt;/td&gt;
&lt;td&gt;72&lt;/td&gt;
&lt;td&gt;비리스크를 비리스크로 맞춤&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FP&lt;/td&gt;
&lt;td&gt;54&lt;/td&gt;
&lt;td&gt;비리스크를 리스크로 잘못 탐지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FN&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;리스크를 놓침&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TP&lt;/td&gt;
&lt;td&gt;68&lt;/td&gt;
&lt;td&gt;리스크를 맞게 탐지&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;따라서 FN 이 낮은 것이 중요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FP가 높은 것은 리스크 탐지 모델에서는 괜찮다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;리스크를 놓치는 것보다 과탐지가 낫다&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;코랩 GPU 사용시 주의사항&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가끔 현재 코드가 GPU를 사용하지 않는다는 내용의 alert이 떴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;난 무시하고 계속했는데, 나중에 GPU 스토리지 할당량을 초과하여 사용할 수 없게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코랩 무료버전은 그렇게 끝이 났다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BERT모델은 GPU를 보통 사용한다고 했고, CPU로 돌렸을 때 매우 느렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 부캠에서 지원해주는 돈으로 코랩 프로를 결제했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더 좋은 GPU 를 사용할 수 있었다. 훨씬 빠른 느낌이었다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음에는 GPU alert을 무시하지 말아야겠다...&lt;/p&gt;
&lt;p data-end=&quot;364&quot; data-start=&quot;257&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;364&quot; data-start=&quot;257&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;364&quot; data-start=&quot;257&quot; data-ke-size=&quot;size23&quot;&gt;코드&lt;/h3&gt;
&lt;pre id=&quot;code_1772801093272&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 코랩에 라이브러리 설치
!pip install transformers
!pip install torch
!pip install scikit-learn
!pip install pandas
!pip install tqdm

# 구글 드라이브 연결
from google.colab import drive
drive.mount('/content/drive')

# 학습데이터 불러오기
import pandas as pd

path1 = &quot;/content/drive/MyDrive/BERT 감성분석용 1차라벨링 545.csv&quot;
path2 = &quot;/content/drive/MyDrive/BERT 감성분석용 2차라벨링 491.csv&quot;

df1 = pd.read_csv(path1)
df2 = pd.read_csv(path2)

df = pd.concat([df1, df2], ignore_index=True)

df = df[['naver_article_id','text','label']]
df = df.dropna()

print(len(df))
df.head()

# 라벨 이진화 - 리스크(0,1) / 비리스크(2,3)
df['risk_label'] = df['label'].apply(lambda x: 1 if x in [0,1] else 0)

# seed 설정
import random
import numpy as np
import torch

seed = 42

random.seed(seed)
np.random.seed(seed)
torch.manual_seed(seed)
torch.cuda.manual_seed_all(seed)

# Train / Validation 분리
from sklearn.model_selection import train_test_split

train_df, val_df = train_test_split(
    df,
    test_size=0.2,
    stratify=df['risk_label'],
    random_state=42
)

# tokenizer
from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained(&quot;klue/bert-base&quot;)

# Dataset 클래스
import torch
from torch.utils.data import Dataset

class RiskDataset(Dataset):

    def __init__(self, df):
        self.df = df.reset_index(drop=True)

    def __len__(self):
        return len(self.df)

    def __getitem__(self, idx):

        text = str(self.df.loc[idx,'text'])
        label = self.df.loc[idx,'risk_label']

        encoding = tokenizer(
            text,
            truncation=True,
            padding='max_length',
            max_length=256,
            return_tensors='pt'
        )

        return {
            &quot;input_ids&quot;: encoding[&quot;input_ids&quot;].squeeze(),
            &quot;attention_mask&quot;: encoding[&quot;attention_mask&quot;].squeeze(),
            &quot;labels&quot;: torch.tensor(label)
        }
        
# Dataset 생성
train_dataset = RiskDataset(train_df)
val_dataset = RiskDataset(val_df)

# 모델 로드
from transformers import AutoModelForSequenceClassification

model = AutoModelForSequenceClassification.from_pretrained(
    &quot;klue/bert-base&quot;,
    num_labels=2
)

# 역비중치(class-weights) 추가
from sklearn.utils.class_weight import compute_class_weight
import torch
import numpy as np

class_weights = compute_class_weight(
    class_weight=&quot;balanced&quot;,
    classes=np.unique(train_df[&quot;risk_label&quot;]),
    y=train_df[&quot;risk_label&quot;]
)

class_weights = torch.tensor(class_weights, dtype=torch.float)

print(&quot;Class weights:&quot;, class_weights)

# WeightedTrainer 정의
from transformers import Trainer
from torch.nn import CrossEntropyLoss

class WeightedTrainer(Trainer):

    def compute_loss(self, model, inputs, return_outputs=False, **kwargs):

        labels = inputs.get(&quot;labels&quot;)

        outputs = model(**inputs)

        logits = outputs.get(&quot;logits&quot;)

        loss_fct = CrossEntropyLoss(
            weight=class_weights.to(model.device)
        )

        loss = loss_fct(logits, labels)

        return (loss, outputs) if return_outputs else loss
        
# 학습 설정
from transformers import TrainingArguments

training_args = TrainingArguments(
    output_dir=&quot;/content/drive/MyDrive/BERT&quot;,
    learning_rate=2e-5,
    per_device_train_batch_size=16,
    per_device_eval_batch_size=16,
    num_train_epochs=5,
    eval_strategy=&quot;epoch&quot;,
    save_strategy=&quot;epoch&quot;,
    load_best_model_at_end=True,
    seed=42
)

# 평가 metric (f1 확인 - precision 0.55이상, recall 0.8이상이 목표. f1은 이 둘의 평균 지표)
from sklearn.metrics import accuracy_score, f1_score
import numpy as np

def compute_metrics(pred):

    labels = pred.label_ids
    preds = np.argmax(pred.predictions, axis=1)

    acc = accuracy_score(labels, preds)
    f1 = f1_score(labels, preds)

    return {
        &quot;accuracy&quot;: acc,
        &quot;f1&quot;: f1
    }
    
# Trainer
from transformers import Trainer

trainer = WeightedTrainer(
    model=model,
    args=training_args,
    train_dataset=train_dataset,
    eval_dataset=val_dataset,
    compute_metrics=compute_metrics
)

# 학습
trainer.train()

# Validation 에 필요한 라이브러리
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.metrics import (
    precision_score,
    recall_score,
    f1_score,
    confusion_matrix,
    precision_recall_curve,
    auc
)

# Validation 예측
from scipy.special import softmax

pred_output = trainer.predict(val_dataset)

logits = pred_output.predictions
y_true = pred_output.label_ids

# softmax 확률
probs = softmax(logits, axis=1)

# 리스크 확률만 사용
probs = probs[:,1]

# 기본 metric (threshold = 0.5)
threshold = 0.5
y_pred = (probs &amp;gt;= threshold).astype(int)

precision = precision_score(y_true, y_pred)
recall = recall_score(y_true, y_pred)
f1 = f1_score(y_true, y_pred)

print(&quot;=== 기본 평가 (threshold=0.5) ===&quot;)
print(&quot;Precision:&quot;, precision)
print(&quot;Recall:&quot;, recall)
print(&quot;F1:&quot;, f1)

# Confusion Matrix
cm = confusion_matrix(y_true, y_pred)
print(&quot;\nTN FP\nFN TP&quot;)
print(&quot;\nConfusion Matrix&quot;)
print(cm)

# Threshold Grid Search
from sklearn.metrics import fbeta_score

thresholds = np.arange(0.30, 0.61, 0.05)

results = []

print(&quot;\n=== Threshold Grid Search ===&quot;)

for t in thresholds:

    pred = (probs &amp;gt;= t).astype(int)

    p = precision_score(y_true, pred)
    r = recall_score(y_true, pred)
    f1 = f1_score(y_true, pred)
    f2 = fbeta_score(y_true, pred, beta=2)

    results.append([t, p, r, f1, f2])

    print(f&quot;threshold={t:.2f} | precision={p:.3f} recall={r:.3f} f1={f1:.3f} f2={f2:.3f}&quot;)

result_df = pd.DataFrame(
    results,
    columns=[&quot;threshold&quot;, &quot;precision&quot;, &quot;recall&quot;, &quot;f1&quot;, &quot;f2&quot;]
)

candidate = result_df[(result_df[&quot;recall&quot;] &amp;gt;= 0.8) &amp;amp; (result_df[&quot;precision&quot;] &amp;gt;= 0.55)]

best_row = candidate.loc[candidate[&quot;f2&quot;].idxmax()]

print(&quot;\nBest Threshold (Recall&amp;gt;=0.8, precision&amp;gt;=0.55 기준)&quot;)
print(best_row)

# PR-AUC
precision_curve, recall_curve, _ = precision_recall_curve(y_true, probs)
pr_auc = auc(recall_curve, precision_curve)

plt.figure()
plt.plot(recall_curve, precision_curve)
plt.xlabel(&quot;Recall&quot;)
plt.ylabel(&quot;Precision&quot;)
plt.title(f&quot;PR Curve (AUC={pr_auc:.3f})&quot;)
plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;h3 data-ke-size=&quot;size23&quot;&gt;참고 링크&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://data-minggeul.tistory.com/10&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://data-minggeul.tistory.com/10&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1772799262693&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;ROC-AUC, PR-AUC 개념 비교 정리&quot; data-og-description=&quot;머신러닝에서 분류 모델에 대한 평가 지표로 자주 활용되는 지표로 ROC-AUC, PR-AUC가 있다. 이진 분류 모델의 경우 0에서 1사이의 확률값을 예측한 뒤 임계값 (Threshold) 을 기준으로 0, 1을 분류한다. &quot; data-og-host=&quot;data-minggeul.tistory.com&quot; data-og-source-url=&quot;https://data-minggeul.tistory.com/10&quot; data-og-url=&quot;https://data-minggeul.tistory.com/10&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/HYvKI/dJMb9c9vMjc/XtYiuQtYZgeuNKd1T0Qsb1/img.png?width=791&amp;amp;height=319&amp;amp;face=0_0_791_319,https://scrap.kakaocdn.net/dn/B6mtx/dJMb9kmaHq2/SMKjBIs7FMEtEGPv8RZy41/img.png?width=791&amp;amp;height=319&amp;amp;face=0_0_791_319,https://scrap.kakaocdn.net/dn/gRiv5/dJMb9bv0dEX/vMiqqJ4QgLgH0X09fiS1DK/img.png?width=792&amp;amp;height=321&amp;amp;face=0_0_792_321&quot;&gt;&lt;a href=&quot;https://data-minggeul.tistory.com/10&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://data-minggeul.tistory.com/10&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/HYvKI/dJMb9c9vMjc/XtYiuQtYZgeuNKd1T0Qsb1/img.png?width=791&amp;amp;height=319&amp;amp;face=0_0_791_319,https://scrap.kakaocdn.net/dn/B6mtx/dJMb9kmaHq2/SMKjBIs7FMEtEGPv8RZy41/img.png?width=791&amp;amp;height=319&amp;amp;face=0_0_791_319,https://scrap.kakaocdn.net/dn/gRiv5/dJMb9bv0dEX/vMiqqJ4QgLgH0X09fiS1DK/img.png?width=792&amp;amp;height=321&amp;amp;face=0_0_792_321');&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;ROC-AUC, PR-AUC 개념 비교 정리&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;머신러닝에서 분류 모델에 대한 평가 지표로 자주 활용되는 지표로 ROC-AUC, PR-AUC가 있다. 이진 분류 모델의 경우 0에서 1사이의 확률값을 예측한 뒤 임계값 (Threshold) 을 기준으로 0, 1을 분류한다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;data-minggeul.tistory.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;</description>
      <category>내일배움캠프-데이터분석</category>
      <author>kyejin0412</author>
      <guid isPermaLink="true">https://kyejin0412.tistory.com/77</guid>
      <comments>https://kyejin0412.tistory.com/77#entry77comment</comments>
      <pubDate>Fri, 6 Mar 2026 21:45:17 +0900</pubDate>
    </item>
    <item>
      <title>Week 20-4 최종프로젝트 - 브랜드 필터링, 감성분석 라벨링</title>
      <link>https://kyejin0412.tistory.com/76</link>
      <description>&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;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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;BERT 모델은 GPU를 쓰라고 만들어졌다고 들어서, 무료 GPU를 사용하기 위해 코랩으로 돌렸다.&lt;/li&gt;
&lt;li&gt;라벨링 600개 -&amp;gt; 700개 -&amp;gt; 800개로 최종 200개 추가하여 까르띠에(0), 타브랜드(1) 을 이진 분류하는 모델을 만들었다.&lt;/li&gt;
&lt;li&gt;threshold(임계값)를 기준으로 그 이상이면 1, 아니면 0으로 분류하는데, 이것으로 성능을 개선한다.&lt;/li&gt;
&lt;li&gt;클래스(이번엔 0,1) 불균형이란, 클래스별 데이터 개수의 불균형을 말하는데, &lt;br /&gt;이번에 660:137 로 불균형이 있어서 class_weight로 처리했다.&lt;/li&gt;
&lt;li&gt;성능은 threshold 0.4 이하는 모두 같아서, 0.3까지 확인하고 멈췄다.&lt;/li&gt;
&lt;li&gt;주의할 점 : 고유 식별 컬럼(PK)는 지우지 말자!&amp;nbsp;&lt;br /&gt;학습데이터에서 고유 식별자인 naver_article_id를 지우고 text, label 컬럼만 남겼었는데, 전체 데이터에서 빼려고 하니 식별자가 없어서 뺄 수가 없었다. text로 같은 내용인 행의 id를 매칭해줘도 학습 데이터 개수와 매칭된 데이터 수가 너무 달랐다.&lt;br /&gt;애초에 지우지 말자!!!&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;이진 분류 모델 코드&lt;/h4&gt;
&lt;pre id=&quot;code_1772682637761&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;!pip install transformers datasets scikit-learn -q


# 라이브러리
!pip install transformers

import pandas as pd
import torch
import torch.nn as nn

from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report

from transformers import AutoTokenizer, AutoModelForSequenceClassification
from torch.utils.data import Dataset, DataLoader
from torch.optim import AdamW


# 구글 드라이브 연결
from google.colab import drive
drive.mount('/content/drive')


# 데이터 불러오기
file_path = '파일 경로'

df = pd.read_csv(file_path)


# Train / Validation 분리
texts = df[&quot;text&quot;].astype(str)
labels = df[&quot;label&quot;]

train_texts, val_texts, train_labels, val_labels = train_test_split(
    texts,
    labels,
    test_size=0.15,
    stratify=labels,
    random_state=42
)


# 토크나이저
tokenizer = AutoTokenizer.from_pretrained(&quot;klue/bert-base&quot;)


# Dataset 만들기
class TextDataset(Dataset):
    
    def __init__(self, texts, labels):
        self.texts = texts.tolist()
        self.labels = labels.tolist()
    
    def __len__(self):
        return len(self.texts)
    
    def __getitem__(self, idx):
        
        encoding = tokenizer(
            self.texts[idx],
            truncation=True,
            padding='max_length',
            max_length=128,
            return_tensors=&quot;pt&quot;
        )
        
        item = {key: val.squeeze(0) for key, val in encoding.items()}
        item[&quot;labels&quot;] = torch.tensor(self.labels[idx])
        
        return item
        
        
# 데이터 로더
train_dataset = TextDataset(train_texts, train_labels)
val_dataset = TextDataset(val_texts, val_labels)

train_loader = DataLoader(train_dataset, batch_size=16, shuffle=True)
val_loader = DataLoader(val_dataset, batch_size=16)


# 모델 로드
device = torch.device(&quot;cuda&quot; if torch.cuda.is_available() else &quot;cpu&quot;)

model = AutoModelForSequenceClassification.from_pretrained(
    &quot;klue/bert-base&quot;,
    num_labels=2
)

model.to(device)


# 옵티마이저
optimizer = AdamW(
    model.parameters(),
    lr=2e-5
)


# class weight(중요!! 불균형 데이터이므로 성능 개선을 위해 불균형 처리)
class_weights = torch.tensor([1.0, 4.8]).to(device)

loss_fn = nn.CrossEntropyLoss(weight=class_weights)


# 학습
num_epochs = 5

for epoch in range(num_epochs):

    print(f&quot;\nEpoch {epoch+1}&quot;)

    model.train()
    total_loss = 0

    for batch in train_loader:

        optimizer.zero_grad()

        input_ids = batch[&quot;input_ids&quot;].to(device)
        attention_mask = batch[&quot;attention_mask&quot;].to(device)
        labels = batch[&quot;labels&quot;].to(device)

        outputs = model(
            input_ids=input_ids,
            attention_mask=attention_mask
        )

        loss = loss_fn(outputs.logits, labels)

        loss.backward()

        optimizer.step()

        total_loss += loss.item()

    print(&quot;Train Loss:&quot;, total_loss / len(train_loader))
    
    
   # 평가
   model.eval()

preds_all = []
labels_all = []

with torch.no_grad():

    for batch in val_loader:

        input_ids = batch[&quot;input_ids&quot;].to(device)
        attention_mask = batch[&quot;attention_mask&quot;].to(device)
        labels = batch[&quot;labels&quot;].to(device)

        outputs = model(
            input_ids=input_ids,
            attention_mask=attention_mask
        )

        # preds = torch.argmax(outputs.logits, dim=1)
        probs = torch.softmax(outputs.logits, dim=1)[:,1]   # 타브랜드 확률
        preds = (probs &amp;gt; 0.3).long()                        # threshold

        preds_all.extend(preds.cpu().numpy())
        labels_all.extend(labels.cpu().numpy())

print(classification_report(labels_all, preds_all))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;성능 비교&lt;/h4&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&amp;nbsp; 1. &lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;preds = torch.argmax(outputs.logits, dim=1)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; precision &amp;nbsp; &amp;nbsp;recall &amp;nbsp;f1-score &amp;nbsp; support&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0 &amp;nbsp; &amp;nbsp; &amp;nbsp; 0.92 &amp;nbsp; &amp;nbsp; &amp;nbsp;0.99 &amp;nbsp; &amp;nbsp; &amp;nbsp;0.95 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;99&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1 &amp;nbsp; &amp;nbsp; &amp;nbsp; 0.92 &amp;nbsp; &amp;nbsp; &amp;nbsp;0.57 &amp;nbsp; &amp;nbsp; &amp;nbsp;0.71 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;21&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&amp;nbsp; &amp;nbsp; accuracy &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0.92 &amp;nbsp; &amp;nbsp; &amp;nbsp; 120&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;macro avg &amp;nbsp; &amp;nbsp; &amp;nbsp; 0.92 &amp;nbsp; &amp;nbsp; &amp;nbsp;0.78 &amp;nbsp; &amp;nbsp; &amp;nbsp;0.83 &amp;nbsp; &amp;nbsp; &amp;nbsp; 120&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;weighted avg &amp;nbsp; &amp;nbsp; &amp;nbsp; 0.92 &amp;nbsp; &amp;nbsp; &amp;nbsp;0.92 &amp;nbsp; &amp;nbsp; &amp;nbsp;0.91 &amp;nbsp; &amp;nbsp; &amp;nbsp; 120&lt;/span&gt;&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/div&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;2. threshold 0.45&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; precision &amp;nbsp; &amp;nbsp;recall &amp;nbsp;f1-score &amp;nbsp; support&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0 &amp;nbsp; &amp;nbsp; &amp;nbsp; 0.92 &amp;nbsp; &amp;nbsp; &amp;nbsp;0.99 &amp;nbsp; &amp;nbsp; &amp;nbsp;0.96 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;99&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1 &amp;nbsp; &amp;nbsp; &amp;nbsp; 0.93 &amp;nbsp; &amp;nbsp; &amp;nbsp;0.62 &amp;nbsp; &amp;nbsp; &amp;nbsp;0.74 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;21&lt;br /&gt;&amp;nbsp; &amp;nbsp; accuracy &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0.93 &amp;nbsp; &amp;nbsp; &amp;nbsp; 120&lt;br /&gt;&amp;nbsp; &amp;nbsp;macro avg &amp;nbsp; &amp;nbsp; &amp;nbsp; 0.93 &amp;nbsp; &amp;nbsp; &amp;nbsp;0.80 &amp;nbsp; &amp;nbsp; &amp;nbsp;0.85 &amp;nbsp; &amp;nbsp; &amp;nbsp; 120&lt;br /&gt;weighted avg &amp;nbsp; &amp;nbsp; &amp;nbsp; 0.93 &amp;nbsp; &amp;nbsp; &amp;nbsp;0.93 &amp;nbsp; &amp;nbsp; &amp;nbsp;0.92 &amp;nbsp; &amp;nbsp; &amp;nbsp; 120&lt;/blockquote&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;3. threshold 0.4&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; precision &amp;nbsp; &amp;nbsp;recall &amp;nbsp;f1-score &amp;nbsp; support&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0 &amp;nbsp; &amp;nbsp; &amp;nbsp; 0.93 &amp;nbsp; &amp;nbsp; &amp;nbsp;0.99 &amp;nbsp; &amp;nbsp; &amp;nbsp;0.96 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;99&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1 &amp;nbsp; &amp;nbsp; &amp;nbsp; 0.93 &amp;nbsp; &amp;nbsp; &amp;nbsp;0.67 &amp;nbsp; &amp;nbsp; &amp;nbsp;0.78 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;21&lt;br /&gt;&amp;nbsp; &amp;nbsp; accuracy &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0.93 &amp;nbsp; &amp;nbsp; &amp;nbsp; 120&lt;br /&gt;&amp;nbsp; &amp;nbsp;macro avg &amp;nbsp; &amp;nbsp; &amp;nbsp; 0.93 &amp;nbsp; &amp;nbsp; &amp;nbsp;0.83 &amp;nbsp; &amp;nbsp; &amp;nbsp;0.87 &amp;nbsp; &amp;nbsp; &amp;nbsp; 120&lt;br /&gt;weighted avg &amp;nbsp; &amp;nbsp; &amp;nbsp; 0.93 &amp;nbsp; &amp;nbsp; &amp;nbsp;0.93 &amp;nbsp; &amp;nbsp; &amp;nbsp;0.93 &amp;nbsp; &amp;nbsp; &amp;nbsp; 120&lt;/blockquote&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;4. threshold 0.35&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; precision &amp;nbsp; &amp;nbsp;recall &amp;nbsp;f1-score &amp;nbsp; support&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0 &amp;nbsp; &amp;nbsp; &amp;nbsp; 0.93 &amp;nbsp; &amp;nbsp; &amp;nbsp;0.99 &amp;nbsp; &amp;nbsp; &amp;nbsp;0.96 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;99&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1 &amp;nbsp; &amp;nbsp; &amp;nbsp; 0.93 &amp;nbsp; &amp;nbsp; &amp;nbsp;0.67 &amp;nbsp; &amp;nbsp; &amp;nbsp;0.78 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;21&lt;br /&gt;&amp;nbsp; &amp;nbsp; accuracy &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0.93 &amp;nbsp; &amp;nbsp; &amp;nbsp; 120&lt;br /&gt;&amp;nbsp; &amp;nbsp;macro avg &amp;nbsp; &amp;nbsp; &amp;nbsp; 0.93 &amp;nbsp; &amp;nbsp; &amp;nbsp;0.83 &amp;nbsp; &amp;nbsp; &amp;nbsp;0.87 &amp;nbsp; &amp;nbsp; &amp;nbsp; 120&lt;br /&gt;weighted avg &amp;nbsp; &amp;nbsp; &amp;nbsp; 0.93 &amp;nbsp; &amp;nbsp; &amp;nbsp;0.93 &amp;nbsp; &amp;nbsp; &amp;nbsp;0.93 &amp;nbsp; &amp;nbsp; &amp;nbsp; 120&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;5. threshold 0.3&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; precision &amp;nbsp; &amp;nbsp;recall &amp;nbsp;f1-score &amp;nbsp; support&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0 &amp;nbsp; &amp;nbsp; &amp;nbsp; 0.93 &amp;nbsp; &amp;nbsp; &amp;nbsp;0.99 &amp;nbsp; &amp;nbsp; &amp;nbsp;0.96 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;99&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1 &amp;nbsp; &amp;nbsp; &amp;nbsp; 0.93 &amp;nbsp; &amp;nbsp; &amp;nbsp;0.67 &amp;nbsp; &amp;nbsp; &amp;nbsp;0.78 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;21&lt;br /&gt;&amp;nbsp; &amp;nbsp; accuracy &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0.93 &amp;nbsp; &amp;nbsp; &amp;nbsp; 120&lt;br /&gt;&amp;nbsp; &amp;nbsp;macro avg &amp;nbsp; &amp;nbsp; &amp;nbsp; 0.93 &amp;nbsp; &amp;nbsp; &amp;nbsp;0.83 &amp;nbsp; &amp;nbsp; &amp;nbsp;0.87 &amp;nbsp; &amp;nbsp; &amp;nbsp; 120&lt;br /&gt;weighted avg &amp;nbsp; &amp;nbsp; &amp;nbsp; 0.93 &amp;nbsp; &amp;nbsp; &amp;nbsp;0.93 &amp;nbsp; &amp;nbsp; &amp;nbsp;0.93 &amp;nbsp; &amp;nbsp; &amp;nbsp; 120&lt;/blockquote&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&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;p data-ke-size=&quot;size16&quot;&gt;비리스크를 리스크로 오해하는 것은 괜찮다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리스크를 비리스크로 오해하는 것이 위험하다. '조기탐색' 이므로, 과하게 잡는건 문제가 되지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;p data-ke-size=&quot;size16&quot;&gt;감성분석은 2단계로 나누기로 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;튜터님도 GPT도 바로 4분류를 하는 것보다, 단계를 낮춰서 모델의 부담을 줄이고, 정확도를 올릴 수 있을 것 같다고 하셨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1차 라벨링 데이터 개수는 545개여서, 모델 성능을 높이기 위해 500개를 추가하기로 했다.&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기준을 명확하고 논리적으로 세우는 것, 기준을 따라 일관적으로 라벨링 하는 것이 가장 중요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;903&quot; data-origin-height=&quot;457&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btI5Lc/dJMcagdBg1k/4aveDKFpilm7wNLASkN63K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btI5Lc/dJMcagdBg1k/4aveDKFpilm7wNLASkN63K/img.png&quot; data-alt=&quot;1차 감성분석 기준&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btI5Lc/dJMcagdBg1k/4aveDKFpilm7wNLASkN63K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtI5Lc%2FdJMcagdBg1k%2F4aveDKFpilm7wNLASkN63K%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;903&quot; height=&quot;457&quot; data-origin-width=&quot;903&quot; data-origin-height=&quot;457&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;1차 감성분석 기준&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;추가 기준 (26.3.5)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;여러 사람이 비슷하게 느꼈을 때 리스크로 성장가능성이 있다면 중립불안&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사이즈, 취향에 대한 불만 표현 &amp;rarr; 중립불안 (주관적)&lt;/li&gt;
&lt;li&gt;사이즈, 취향에 안 맞았다는 사실표현 &amp;rarr; 중립 (불만 표현 없음)&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;무거웠다 &amp;rarr; 쌓이면 리스크가 될 수 있으니 중립불안&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;웨이팅 직접 경험 + 불만/부정 감정 표현(힘들었어요 포함) &amp;rarr; 부정&lt;/li&gt;
&lt;li&gt;웨이팅 직접 경험 + 감정X or 긍정감정 &amp;rarr; 중립불안&lt;/li&gt;
&lt;li&gt;웨이팅 전해들음 / 정보 전달 &amp;rarr; 중립&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;가격이 오른대요 / 오른다더라구요 등 정보전달 &amp;rarr; 중립&lt;/li&gt;
&lt;li&gt;가격 인상 전 구매했어요 / 인상 전 얼른 사세요 / 가격 인상이래요ㅠ 등 그 전에 사야 한다는 뉘앙스, 약한 부정감정 &amp;rarr; 중립부정&lt;/li&gt;
&lt;li&gt;또 가격 인상이네요 짜증나요 / 가격이 사악해요 등 불만표현 &amp;rarr; 부정&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;재고부족 직접 경험 + 불만/부정 감정 표현 (또 없대요, 맨날 없어요, 언제 들어와요 등등) &amp;rarr; 부정&lt;/li&gt;
&lt;li&gt;재고부족 직접 경험 + 감정X or 긍정감정 &amp;rarr; 중립불안&lt;/li&gt;
&lt;li&gt;재고부족 전해들음 / 정보 전달 &amp;rarr; 중립&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;생활기스, 부딪혀서, 떨어뜨려서 기스가 났다 &amp;rarr; 중립 (본인의 문제)&lt;/li&gt;
&lt;li&gt;제품이 기스가 잘 나는 제품 같다는 뉘앙스 &amp;rarr; 중립불안 (제품의 문제)&lt;/li&gt;
&lt;/ul&gt;
&lt;p 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;부정 감정/행동 + 긍정 감정/행동 &amp;rarr; 애매하니까 제거, 모델이 학습하기 어렵기 때문&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;h4 data-ke-size=&quot;size20&quot;&gt;[분석 방향 튜터링]&lt;b&gt;&lt;/b&gt;&lt;/h4&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;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;리스크/비리스크 분류&lt;/li&gt;
&lt;li&gt;리스크: 부정,중립부정 / 비리스크: 긍정,중립 각각 세부 분류&lt;/li&gt;
&lt;li&gt;BERTopic으로 부정, 중립부정 카테고리 나누기&lt;/li&gt;
&lt;li&gt;전략 제안&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&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;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;추가 라벨링 (부정, 중립부정 좀더 많이 추가) - grid search가 될 때까지, 최대한 많이&lt;/li&gt;
&lt;li&gt;기존 라벨링 데이터로 리스크/비리스크 분류 &amp;rarr; 결과 제일 좋은거 채택 &amp;rarr; 추가된 라벨링 데이터로 성능 개선&lt;/li&gt;
&lt;li&gt;추가된 라벨링으로 바로 4분류한 모델에 재학습 시켜보기. (실무에선 리스크탐지에 리콜 60% 이상이면 사용함)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;역비중 가중치 유지 &lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;threhold grid search(0.3, 0.35, 0.4, 0.45 ... 0.6) - 반복문으로 best threshold 찾기 &lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;그래프 확인(PR-AUC, LiftChart, Expected Profit) - 그래프 확인해서 최종 best threshold 찾기&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;[감성분석 기준 튜터링]&lt;b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;두가지 방법이 있음&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 감성분석 라벨링 -&amp;gt; 감성으로만 판단&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 리스크 탐지 라벨링 -&amp;gt; 리스크가 될 수 있을 만한 신호를 모두 부정적으로 잡아냄 (좀더 민감)&lt;/b&gt;&lt;/p&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;b&gt;- 보통의 라벨링 순서는?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 감성 라벨링 -&amp;gt; 감성기준으로만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. -&amp;gt; 리스크는 토픽별로 잡는게 일반적&lt;/p&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;b&gt;- 왜? &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중립 중에 가격, 무게, 내구성 등 일부 키워드들의 빈도수를 보고 리스크 포인트가 되는지 확인하는게 안전함 + 부정 토픽 -&amp;gt; 리스크&amp;nbsp;&lt;/p&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;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;br /&gt;-&amp;gt; 중립을 많이 넣고 싶으면 중립으로 하고 명확한 거만 라벨링 하는게 나을듯&lt;/li&gt;
&lt;li&gt;LLM 쪽은 감성을 명확하게 하는 편인데, 지금은 리스크 탐지니까 리스크 탐지를 위주로 해도 됨&lt;/li&gt;
&lt;li&gt;기준을 바꿔서 앞에 라벨링 한거까지 다시 검토하는건 비효율적임. 시간 오래걸리는건 지양하고 하던대로 하자&lt;/li&gt;
&lt;li&gt;현업에서도 리스크 탐지를 위한 경우 2번 방법으로 하는 경우가 꽤 있음&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>내일배움캠프-데이터분석</category>
      <author>kyejin0412</author>
      <guid isPermaLink="true">https://kyejin0412.tistory.com/76</guid>
      <comments>https://kyejin0412.tistory.com/76#entry76comment</comments>
      <pubDate>Thu, 5 Mar 2026 12:56:59 +0900</pubDate>
    </item>
    <item>
      <title>Week 20-3 최종프로젝트 - 브랜드 필터링</title>
      <link>https://kyejin0412.tistory.com/75</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;p data-ke-size=&quot;size16&quot;&gt;라벨링을 끝내고, BERT 모델을 만드는 와중에 걸림돌을 발견했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부정, 중립부정, 중립, 긍정, 타브랜드로 라벨링을 하고 모델을 학습시키는데 타브랜드의 평가지표가 모두 0으로 나오는 것이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타브랜드의 데이터 개수가 11개로 너무 적어서 발생하는 문제였다. 모델이 타브랜드인지 잡아내질 못한다.&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 BERT로 까르띠에를 판단하는 이진 분류 모델을 만든 후, 전체 데이터에 적용하여 까르띠에 게시글만 남긴다. 그 다음,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 리스크/비리스크로 나눈 뒤, 리스크 안에서 중립부정, 부정을 나눔&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 부정, 중립부정, 중립, 긍정 4개로 감성분석 진행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 두 가지를 수행 후 비교하여, 더 나은 성능의 모델로 채택하기로 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;총데이터 600개 중 타브랜드 55개로 이진 분류 모델을 학습시켰는데 성능이 안 좋았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;epoch수, threshold를 바꿔서 성능을 올리는 데에는 한계가 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 수가 너무 적었기 때문에, 이 모델로 타브랜드일 확률이 높은 데이터들을 순서대로 sort한 다음,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;51~100개의 데이터를 추가로 라벨링 했다(까르띠에:0, 타브랜드:1).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 결과, 확연하게 좋아지는 모습을 보였다. (이전엔 리콜이 0: 1.00 / 1: 0.00 이었다...)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;209&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b09Y81/dJMcaaj745U/JIGWHsgpc9UsjoYQOdI1G1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b09Y81/dJMcaaj745U/JIGWHsgpc9UsjoYQOdI1G1/img.png&quot; data-alt=&quot;데이터 추가 후 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b09Y81/dJMcaaj745U/JIGWHsgpc9UsjoYQOdI1G1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb09Y81%2FdJMcaaj745U%2FJIGWHsgpc9UsjoYQOdI1G1%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;515&quot; height=&quot;209&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;209&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;데이터 추가 후 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;금방 끝났으면 좋겠다..!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;딥러닝에서 데이터가 너무 적을 경우, 조금만 조정하더라도 결과가 휙휙 바뀌고,&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;모델이 패턴이나 기준을 익히지 못하여 성능이 안 좋을 수 밖에 없다.&lt;/p&gt;</description>
      <category>내일배움캠프-데이터분석</category>
      <author>kyejin0412</author>
      <guid isPermaLink="true">https://kyejin0412.tistory.com/75</guid>
      <comments>https://kyejin0412.tistory.com/75#entry75comment</comments>
      <pubDate>Wed, 4 Mar 2026 20:50:32 +0900</pubDate>
    </item>
    <item>
      <title>Week 19-4 최종프로젝트 - BERT 지도학습을 위한 라벨링</title>
      <link>https://kyejin0412.tistory.com/74</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 진전은 크게 없었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;600개의 데이터를 직접 라벨링하는 작업을 했다.&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;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 우리가 정한 기준을 라벨과 같이 적어줬다. (라벨: 부정:0, 중립부정: 1, 중립: 2, 긍정: 3, 타브랜드: 4)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나중에 왜 이렇게 라벨을 붙였는지 얘기하기 편하게 하기 위함이다.&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그나저나 시간이 좀 촉박하다...!!&lt;/p&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;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;라벨링 작업&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;1831&quot; data-origin-height=&quot;822&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RGwIn/dJMcajnIqKB/uOg86a2RvsrpT5Xu5E5vaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RGwIn/dJMcajnIqKB/uOg86a2RvsrpT5Xu5E5vaK/img.png&quot; data-alt=&quot;라벨링 작업&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RGwIn/dJMcajnIqKB/uOg86a2RvsrpT5Xu5E5vaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRGwIn%2FdJMcajnIqKB%2FuOg86a2RvsrpT5Xu5E5vaK%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;1831&quot; height=&quot;822&quot; data-origin-width=&quot;1831&quot; data-origin-height=&quot;822&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;라벨링 작업&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;p data-ke-size=&quot;size16&quot;&gt;유형 기준&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;부정&lt;/td&gt;
&lt;td&gt;명확한 불만&amp;middot;피해&amp;middot;공격적 표현&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;중립부정&lt;/td&gt;
&lt;td&gt;불안, 의심, 걱정(소문 포함), 추측&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;중립&lt;/td&gt;
&lt;td&gt;정보공유, 질문, 구매후기/인증, 투표글&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;긍정&lt;/td&gt;
&lt;td&gt;만족, 추천, 칭찬&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;b&gt;감정, 행동 섞인 경우&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 감정으로 판단&lt;/p&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;b&gt;감정이 여러 개인 경우 (감정1 + 행동 + 감정2 &amp;hellip;)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; (부정 + 중립부정/긍정 감정이 섞여있을 때)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a. 부정 감정이 하나라도 있으면 부정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; (부정 or 중립부정 키워드 있을 때)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;b. 브랜드가 고칠 수 있는 문제(브랜드 운영/제품 품질/가격/유통/CS에 대한 언급)면 부정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c. 확실한 부정표현이 있으면 부정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;d. 본인이 겪지 않은거 + 의심, 걱정, 추측, 소문, 들어보니~ 어떻다던데 괜찮나요? : 중립부정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;j. 본인이 겪은거 + 저만 이런가요?, 걱정, 추측, 의심o / 그냥 쓰려구요 등 불만 표현 x : 중립부정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;k. 본인이 겪은거 + 확실한 불만, 화남, 피해, 공격적 표현 : 부정 - 웨이팅 길었는데 겨우 샀어요 처럼 부정 키워드 섞인 경험을 직접 겪은 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; (자기 취향에 대한 불만)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;e. 브랜드가 고칠 수 있는 문제(제품 규격/설계 문제 제기, &amp;ldquo;왜 이렇게 나오냐&amp;rdquo; 운영 비판)면 부정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;f. 고칠 수 없으면(디자인 취향, 개인 체형 문제, 퍼스널 컬러 문제 등 + 부정적 감정) 중립부정 - &amp;lsquo;&amp;rsquo;안 이쁘다&amp;rdquo;, &amp;ldquo;촌스러&amp;rdquo;, &amp;ldquo;질린다&amp;rdquo;, &amp;ldquo;유행 끝&amp;rdquo;, &amp;ldquo;흔해짐&amp;rdquo;, &amp;ldquo;사진빨&amp;rdquo;, &amp;ldquo;생각했던 것과 다름&amp;rdquo; - 부정감정 예시 : &amp;ldquo;막상 샀는데 다른게 더 예뻐서 후회된다/교환/환불할까 고민된다&amp;rdquo;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;정보성 글, 질문, 구매후기/인증글, 투표글(투표, 골라주세요)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 감정표현이 섞였지만 딱히 우세한 감정은 없음, 제품/사이즈 고민 중(골라주세요X)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; g. 중립&lt;/p&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;b&gt;칭찬, 만족, 추천 등 긍정 감정만 있는 경우&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; h. 긍정&lt;/p&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;b&gt;다른 브랜드&lt;/b&gt;&lt;b&gt; 글이 대부분이고, '저도 까르띠에 있어요' 와 같이 유의미한 내용이 없을 경우&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; i. 라벨링 별도로 붙이기 (4)&lt;/p&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;b&gt;개인간 거래, 가품, 리셀&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; L. &lt;b&gt;불만표현o :&lt;/b&gt; 쌓일 경우 브랜드 이미지 손상되므로 중립부정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; z. &lt;b&gt;불만표현x :&lt;/b&gt; 중립&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;b&gt;중립불안/부정 기준&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;부정 : 부정감정이 확실한 것 + 브랜드가 고칠 수 있는 문제&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;약간 디자인이 별로인 것 같은데 저만 이런가요? &amp;rarr; 중립부정 (개인 취향)&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>kyejin0412</author>
      <guid isPermaLink="true">https://kyejin0412.tistory.com/74</guid>
      <comments>https://kyejin0412.tistory.com/74#entry74comment</comments>
      <pubDate>Thu, 26 Feb 2026 21:25:48 +0900</pubDate>
    </item>
    <item>
      <title>Week 19-3 최종프로젝트 - BERT 분석 방향 수정</title>
      <link>https://kyejin0412.tistory.com/73</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우린 감성분석으로 긍정/부정/중립부정(걱정,불안,의심 등)/중립 4가지를 나누기로 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 사용하기로 한 것이 BERT이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BERT 감성분석 -&amp;gt; 중립부정에서 BERTopic으로 클러스터링 하고 대표키워드를 찾기 -&amp;gt; 클러스터링을 바탕으로 유형나누기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유형별 시계열 분석, 댓글데이터로 확산지표 만들어서 분석&amp;nbsp;&lt;/p&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;/p&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;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&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;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;p data-ke-size=&quot;size16&quot;&gt;우리의 경우, 긍정/부정/중립부정/중립 기준이 있으므로 지도학습을 해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비지도학습으로 대충 라벨링을 하고, 그 후 지도학습을 해서 파인튜닝을 하자는 계획이 틀렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기계한테 비지도학습을 시킬 경우, 마음대로 4가지로 나눠버려서 우리 기준대로 그룹화가 잘 안 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리는 지도학습을 위해 750개의 데이터를 뽑아 라벨링을 하기로 하였다. 중복 제거 후 721개의 행이 남았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;팀 모두 각자 기준을 확인하며 분류를 해보고, 의견이 갈리는 데이터를 같이 논의하기로 했다.&lt;/p&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;&amp;nbsp;&lt;/p&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;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[유형 기준]&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;부정&lt;/td&gt;
&lt;td&gt;명확한 불만&amp;middot;피해&amp;middot;공격적 표현&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;중립부정&lt;/td&gt;
&lt;td&gt;불안, 의심, 걱정(소문 포함), 추측&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;중립&lt;/td&gt;
&lt;td&gt;정보공유, 질문, 구매후기/인증, 투표글&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;긍정&lt;/td&gt;
&lt;td&gt;만족, 추천, 칭찬&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;b&gt;1. 감정, 행동 섞인 경우&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 감정으로 판단&lt;/p&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;b&gt;2. 감정이 여러 개인 경우 (감정1 + 행동 + 감정2 &amp;hellip;)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; (부정 + 중립부정/긍정 감정이 섞여있을 때)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a. 부정 감정이 하나라도 있으면 &lt;span style=&quot;color: #ee2323;&quot;&gt;부정&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; (부정 감정 or 중립불안 키워드 있을 때)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;b. 브랜드가 고칠 수 있는 문제(브랜드 운영/제품 품질/가격/유통/CS에 대한 언급)면&lt;span style=&quot;color: #ee2323;&quot;&gt; 부정&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c. 확실한 부정표현이 있으면 &lt;span style=&quot;color: #ee2323;&quot;&gt;부정&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;d. 그 외는 &lt;span style=&quot;color: #f89009;&quot;&gt;중립부정&lt;/span&gt;(=의심, 걱정, 추측, 소문, 들어보니~ 어떻다던데 괜찮나요?)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; (자기 취향에 대한 불만)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;e. 브랜드가 고칠 수 있는 문제(제품 규격/설계 문제 제기, &amp;ldquo;왜 이렇게 나오냐&amp;rdquo; 운영 비판)면&lt;span style=&quot;color: #ee2323;&quot;&gt; 부정&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;f. 고칠 수 없으면(디자인 취향, 개인 체형 문제, 퍼스널 컬러 문제 등) &lt;span style=&quot;color: #f89009;&quot;&gt;중립부정&lt;/span&gt; &lt;br /&gt;&amp;nbsp; &amp;nbsp;- &amp;lsquo;&amp;rsquo;안 이쁘다&amp;rdquo;, &amp;ldquo;촌스러&amp;rdquo;, &amp;ldquo;질린다&amp;rdquo;, &amp;ldquo;유행 끝&amp;rdquo;, &amp;ldquo;흔해짐&amp;rdquo; 등 포함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;교환, 환불 고민? : 중립불안?&lt;/p&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;b&gt;3. 정보성 글, 질문, 구매후기/인증글, 투표글(투표, 골라주세요)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(여러 감정표현이 섞였지만 딱히 우세한 감정은 없음, 제품/사이즈 고민 중(골라주세요X))&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; g. 중립&lt;/p&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;b&gt;4. 칭찬, 만족, 추천 등 긍정 감정만 있는 경우&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; h. 긍정&lt;/p&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;b&gt;5. 다른 브랜드 글이 대부분이고, '저도 까르띠에 있어요' 와 같이 유의미한 내용이 없을 경우&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; i. 라벨링 별도로 붙이기 (타브랜드)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;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;약간 디자인이 별로인 것 같은데 저만 이런가요? &amp;rarr; 중립부정 (개인 취향)&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>내일배움캠프-데이터분석</category>
      <author>kyejin0412</author>
      <guid isPermaLink="true">https://kyejin0412.tistory.com/73</guid>
      <comments>https://kyejin0412.tistory.com/73#entry73comment</comments>
      <pubDate>Wed, 25 Feb 2026 23:50:34 +0900</pubDate>
    </item>
    <item>
      <title>Week 18-7 BDA x 데이콘 최종과제 공모전 후기</title>
      <link>https://kyejin0412.tistory.com/72</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BDA의 최종과제는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 최종보고서 제출&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 데이콘 성능 f1-score 0.42 이상&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과부터 말하면 난 성능이 0.39가 최대였어서 수료를 못할 것 같다...ㅜㅜ 어제 새벽 4시까지 했는데 너무 아쉽다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수료조건이 너무 까다로운 거 아닙니까 BDA!!&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;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&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;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://dacon.io/competitions/official/236664/overview/description&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://dacon.io/competitions/official/236664/overview/description&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1771835745600&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;데이콘 x BDA 제 2회 학습자 수료 예측 AI 경진대회 - DACON&quot; data-og-description=&quot;분석시각화 대회 코드 공유 게시물은 내용 확인 후 좋아요(투표) 가능합니다.&quot; data-og-host=&quot;dacon.io&quot; data-og-source-url=&quot;https://dacon.io/competitions/official/236664/overview/description&quot; data-og-url=&quot;https://dacon.io/competitions/official/236664/overview/description&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bKM5u7/dJMb87f3jft/rpEWt1Tyl6KPTAq6RroaAk/img.png?width=1440&amp;amp;height=810&amp;amp;face=0_0_1440_810&quot;&gt;&lt;a href=&quot;https://dacon.io/competitions/official/236664/overview/description&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://dacon.io/competitions/official/236664/overview/description&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bKM5u7/dJMb87f3jft/rpEWt1Tyl6KPTAq6RroaAk/img.png?width=1440&amp;amp;height=810&amp;amp;face=0_0_1440_810');&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;데이콘 x BDA 제 2회 학습자 수료 예측 AI 경진대회 - DACON&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;분석시각화 대회 코드 공유 게시물은 내용 확인 후 좋아요(투표) 가능합니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;dacon.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;h4 style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;[주제]&lt;/h4&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;학습자의 수료 여부를 예측하는 AI 알고리즘 개발&lt;/p&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;[설명]&lt;/h4&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;BDA 9기 학습자 데이터를 분석하여 10기 학습자의 수료 여부를 예측하는 AI 알고리즘 개발&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;[데이터셋]&lt;/h4&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;Dataset Info.(Updated 26.02.10)&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: left;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;&lt;b&gt;1. train.csv [파일]&lt;/b&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;ID : 샘플별 고유 ID&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;generation : BDA 기수&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;school1 : 대학교&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;major type : 복수전공 여부&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;major1_1 : 제1전공&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;major1_2 : 제2전공&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;major_data : 제1전공 전공자 여부&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;제&amp;nbsp;1전공에&amp;nbsp;'컴퓨터',&amp;nbsp;'인공지능',&amp;nbsp;'AI',&amp;nbsp;'소프트웨어',&amp;nbsp;'데이터',&amp;nbsp;'통계',&amp;nbsp;'산업경영',&amp;nbsp;'산업'&amp;nbsp;이&amp;nbsp;포함되면&amp;nbsp;True&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;job : 현재 직무&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;class1~4 : 수강 분반&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;re_registration : 학기당 새로운 학회원을 모집할 때 재등록 여부&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;contest_award : 공모전 수상 경력&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;nationality : 내/외국인 여부&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;inflow_route : 유입 경로&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;whyBDA : BDA를 선택한 이유&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;what_to_gain : BDA에서 얻고싶은 것&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;hope_for_group : 조별활동 희망 여부&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;previous_class_3~9 : 각 기수를 수강했을 시 분반&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;major_field : 전공 분야&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;desired_career_path : 희망 진로&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;completed_semester : 대학교 이수학기&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;project_type : 팀/개인 중 프로젝트에 참여하고 싶은 형태&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;time_input : 하루에 BDA에 투입 가능한 시간&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;desired_job : 희망 직무&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;certificate_acquisition : 취득한 자격증&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;desired_certificate : 취득을 희망하는 자격증&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;desired_job_except_data : 데이터 외 희망 직무&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;incumbents_level : 어느 정도 연차의 현직자를 원하는지&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;incumbents_lecture : 어떤 주제의 현직자 강의를 원하는지&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;incumbents_company_level : 강연 현직자가 어느정도 규모의 회사를 다니는 사람이었으면 좋겠는지&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;incumbents_lecture_type : 온, 오프라인 중 원하는 현직자 강연 형태&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;incumbents_lecture_scale : 원하는 현직자 강의 규모&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;&lt;span style=&quot;color: #0066cc;&quot;&gt;'3~50명 내외의 강의 리스너와 1명의 현직자' 는 '30~50명 내외의 강의 리스너와 1명의 현직자'를 의미합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;incumbents_lecture_scale_reason : 현직자 강의 규모 선택 이유&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;interested_company : 관심있는 기업명&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;expected_domain : 희망하는 도메인&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;contest_participation : 데이터 관련 대회 경험&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;idea_contest : 아이디어 공모전에 대한 경험&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;onedayclass_topic : 원데이 클래스 주제&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;completed : (TARGET) 수료 여부(0 - 미수료 , 1 - 수료)&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;※ 본 대회는 기존 1회 대회와 달리, 중도 탈퇴를 예측하는 것이 아니라 학습 과정을 끝까지 완료하여 &amp;lsquo;수료&amp;rsquo;에 도달한 학습자를 예측하는 것을 목표로 합니다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: left;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;&lt;b&gt;2. test.csv [파일]&lt;/b&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;ID : 샘플별 고유 ID&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;completed 칼럼 존재하지 않음.&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;그 외 train.csv 파일과 구성 동일&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;&amp;nbsp;&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;&lt;b&gt;sample_submission.csv [파일] - 제출 양식&lt;/b&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;ID : 샘플별 고유 ID&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;completed : (TARGET) 수료 여부(0, 1)&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;train 데이터 전처리를 할 때, 결측치 삭제나 이상치 삭제를 했다. train만 보면 문제가 안되지만, test 데이터에 같은 방식으로 전처리를 해야 했는데 test데이터는 삭제를 하면 안돼서 모델학습을 다 했다가 train 데이터 전처리를 다시 했다...&lt;/li&gt;
&lt;li&gt;파생변수를 안 만들었다. 단일변수로만 하려다보니 '이전 수강분반' 컬럼이 과적합이 돼서 '이전 수강 여부' 컬럼을 추가하고 분반명은 다 drop해서 다시 했다.&lt;/li&gt;
&lt;li&gt;튜닝이 이렇게 오래 걸릴 줄 몰랐다. XGB 모델은 성능이 좋다그랬고, GPT의 도움을 받으면서 몇 번 손보면 금방 목표 성능이 나올 줄 알았는데 오산이었다. 또한 혼자서도 잘할 수 있을 거라고 자신했는데, 팀으로 참여한 사람들의 점수가 확실히 높았다. 다음에는 팀플을 믿어보는 것도 나쁘지 않을 것 같다. (팀플에 질려서 혼자 하고 싶었던 1인..)&lt;/li&gt;
&lt;li&gt;데이콘에 하루 제출가능 횟수가 정해져 있을 줄 몰랐다. 나한테 주어진 시험횟수는 5번... 턱없이 부족했다.&lt;/li&gt;
&lt;li&gt;다음에는 필요없는 컬럼을 골라낼 때 내 주관만으로 하지 말고, 기법과 섞으면 좋을 것 같다.&lt;br /&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #0a0a0a; text-align: start;&quot; data-processed=&quot;true&quot; data-complete=&quot;true&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: decimal;&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAEICRAA&quot;&gt;&lt;span data-complete=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;필터링 (주관)&lt;/b&gt;: ID나 상식적으로 무관한 컬럼을 1차로 제거&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAEICRAB&quot;&gt;&lt;span data-complete=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;탐색적 데이터 분석 (EDA)&lt;/b&gt;: 상관계수 히트맵(Correlation Heatmap)이나 산점도를 그려보기&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot; data-sae=&quot;&quot; data-complete=&quot;true&quot; data-hveid=&quot;CAEICRAC&quot;&gt;&lt;span data-complete=&quot;true&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;특성 중요도 (모델링)&lt;/b&gt;: 랜덤 포레스트나 XGBoost 같은 모델을 가볍게 돌려&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Feature Importance&lt;/b&gt;를 뽑아보고, 내가 버리려 했던 컬럼의 중요도가 높게 나오는지 확인&lt;/span&gt;&lt;/li&gt;
&lt;/ol&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;배운점&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;머신러닝을 할 때 train data, test data 모두 동일하게 전처리를 해야 한다. 컬럼이 같아야 학습된 내용을 test에 적용할 수 있다.&lt;/li&gt;
&lt;li&gt;타겟 컬럼의 비율이 불균형하다면 scale_pos_weight로 균형을 맞춰줘야 성능이 개선된다.&lt;/li&gt;
&lt;li&gt;머신러닝은 노가다다. 직접 튜닝해가며 성능을 개선시켜야 한다. 시간이 오래걸린다. 감안하고 작업하자.&lt;/li&gt;
&lt;li&gt;이전 수강 분반명같은 컬럼을 원핫 인코딩하면 과적합될 가능성이 있다. 이런 컬럼은 이전에 수강을 했는지 여부로 새로운 컬럼을 만들자.&lt;/li&gt;
&lt;li&gt;단일 변수만 보는 것보다 파생변수 생성을 하는 것이 성능 개선에 큰 도움이 된다. (A + B 컬럼으로 파생변수 생성)&lt;/li&gt;
&lt;li&gt;test data 전처리를 할 때 행 삭제를 해서는 안된다. test data의 모든 경우를 테스트하는 것이기 때문이다.&lt;/li&gt;
&lt;li&gt;train 데이터 전처리를 할 때 6번을 미리 고려하자. 삭제보단 대체가 나을 수 있다. (결측치도 패턴으로 학습)&lt;/li&gt;
&lt;li&gt;train 데이터에서 평균, 중앙값 등으로 결측치 대체를 했다면, test 데이터에서도 train에서 구한 값 그대로 결측치를 대체해야 한다. test 데이터에서 다시 계산을 하면 안된다!!&lt;/li&gt;
&lt;li&gt;머신러닝 순서 : &lt;br /&gt;train data 전처리&lt;br /&gt;train data 학습/튜닝&lt;br /&gt;train 전체 데이터로 평가 &lt;br /&gt;test data를 train data와 같은 방식으로 전처리&lt;br /&gt;test 데이터에 모델 적용&lt;/li&gt;
&lt;li&gt;전처리, 튜닝, 학습, 평가를 왔다갔다 하면서 성능개선을 시키는게 머신러닝이다!&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>BDA</category>
      <author>kyejin0412</author>
      <guid isPermaLink="true">https://kyejin0412.tistory.com/72</guid>
      <comments>https://kyejin0412.tistory.com/72#entry72comment</comments>
      <pubDate>Mon, 23 Feb 2026 17:23:12 +0900</pubDate>
    </item>
  </channel>
</rss>