<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title>광주 광산구 동산동 수도꼭지교체 &amp;gt; 커뮤니티 &amp;gt; 블로그</title>
<link>https://nusu.devtechinfo.xyz/blog</link>
<language>ko</language>
<description>블로그 (2026-10-15 07:21:59)</description>

<item>
<title>학습 곡선, 데이터 양을 늘렸을 때 훈련 점수와 검증 점수를 함께 읽기</title>
<link>https://nusu.devtechinfo.xyz/blog/%ED%95%99%EC%8A%B5-%EA%B3%A1%EC%84%A0-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%96%91%EC%9D%84-%EB%8A%98%EB%A0%B8%EC%9D%84-%EB%95%8C-%ED%9B%88%EB%A0%A8-%EC%A0%90%EC%88%98%EC%99%80/</link>
<description><![CDATA[<p>머신러닝 모델의 성능이 기대보다 낮을 때 데이터를 더 모으면 나아질지 궁금해집니다. 이때 한 번의 검증 점수만으로는 학습 데이터 양이 어떤 영향을 주는지 알기 어렵습니다.</p>
<p>학습 곡선은 서로 다른 훈련 데이터 크기에서 훈련 점수와 검증 점수를 함께 비교하는 도구입니다. 이 글에서는 데이터 수를 가로축으로 놓는 학습 곡선을 다룹니다.</p>
<p>학습 반복 횟수에 따른 손실 기록과 구분하며, 수치 예시는 실제 모델 측정값이 아닌 설명용 가상 값입니다.</p>
<p style="margin:24px 0 8px;"><img src="https://devtechinfo.xyz/data/editor/2610/ai-ce26d1bffc166bd32708.png" alt="훈련 데이터 수 증가를 표현하는 크기가 다른 자료 카드 묶음" width="1200" height="1024" style="height:auto;" /></p>
<p style="font-size:14px;color:#64748b;margin:0 0 24px;">AI 생성 삽화 · 개념 이해를 위한 AI 연출 이미지이며 실제 시스템 구성도나 측정 결과가 아닙니다.</p>
<blockquote style="border-left:4px solid #1e3a5f;background:#f1f5f9;padding:16px 20px;margin:24px 0;"><p><strong>핵심 정리</strong><br />학습 곡선은 데이터 크기에 따른 훈련·검증 점수의 변화와 간격을 함께 읽습니다. 곡선 모양은 다음 실험을 정하는 단서이며 더 많은 데이터의 효과나 원인을 확정하는 증거는 아닙니다.</p></blockquote>
<hr /><h2 style="color:#1e3a5f;">1. 가로축이 무엇인지 먼저 확인합니다</h2>
<p>학습 과정에서 그리는 그래프는 모두 같은 의미를 갖지 않습니다. 여기서 가로축은 모델 학습에 사용한 표본 수이고 세로축은 선택한 평가 점수입니다.</p>
<p>같은 모델 설정을 두고 훈련 자료의 양을 바꾸어 성능이 어떻게 달라지는지 살펴봅니다. 반면 에포크별 손실 그래프는 주어진 자료로 학습을 반복하는 동안의 변화를 보여 줍니다.</p>
<p>데이터를 늘리는 실험과 학습을 오래 하는 실험은 서로 다른 질문에 답합니다. 하이퍼파라미터 값을 가로축으로 바꾸어 점수를 보는 검증 곡선과도 구분해야 합니다.</p>
<p>그래프 이름만 보고 해석하지 말고 축의 의미와 점수의 방향을 먼저 읽는 습관이 중요합니다. 정확도처럼 클수록 좋은 점수인지 오차처럼 작을수록 좋은 값인지에 따라 올라가는 선의 의미가 달라집니다.</p>
<p>실험 기록에는 데이터 크기와 평가 지표, 모델 설정을 함께 남겨 서로 다른 그래프를 같은 조건의 결과처럼 비교하지 않도록 합니다.</p>
<p><a href="https://scikit-learn.org/stable/modules/learning_curve.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">2. 각 크기에서 훈련과 검증을 분리합니다</h2>
<p>학습 곡선을 만들 때에는 훈련에 사용한 자료에서의 점수와 학습에 사용하지 않은 검증 자료에서의 점수를 구분합니다. scikit-learn의 learning_curve는 교차 검증 분할과 여러 훈련 크기를 이용해 이 두 종류의 점수를 계산할 수 있습니다.</p>
<p>크기별로 반환된 분할 점수를 요약해서 평균과 변동을 살펴볼 수 있습니다. 함수가 반환하는 test_scores라는 이름을 최종 평가용으로 따로 보관한 테스트 세트의 결과와 혼동하지 않는 것이 좋습니다.</p>
<p>이 함수 안에서는 교차 검증의 평가 부분에 해당합니다. 훈련 크기를 비율로 지정할 때에도 전체 원본 행 수에 무조건 곱하는 것이 아니라 선택한 검증 방식에서 가능한 훈련 크기를 기준으로 해석해야 합니다.</p>
<p>모델 설정과 분할 방식을 기록하면 점수 차이가 자료의 양 때문인지 실험 조건이 달라졌기 때문인지 확인하기 쉬워집니다. 일부 크기에서 학습이 실패했다면 실패한 결과를 좋은 점수처럼 그래프에 채워 넣지 않고 원인과 제외 조건을 남깁니다.</p>
<p><a href="https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.learning_curve.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">3. 가상 점수의 간격과 변화를 함께 읽습니다</h2>
<p>가상 분류 실험에서 표본 200개를 사용할 때 훈련 정확도는 0.98, 검증 정확도는 0.68이라고 가정합니다. 표본을 800개로 늘렸을 때 두 값이 0.92와 0.78, 1600개에서는 0.89와 0.82가 되었다고 해 보겠습니다.</p>
<p>훈련 점수만 보면 0.98에서 0.89로 내려갔지만 검증 점수는 0.68에서 0.82로 올라갔습니다. 두 점수의 간격도 0.30, 0.14, 0.07로 줄었습니다.</p>
<p>이 예시에서는 훈련 자료에서의 높은 점수를 유지하는 것보다 새로운 자료에서의 변화가 중요한 관찰입니다. 다만 이 숫자가 모든 모델의 전형적인 변화나 기대 성능을 뜻하는 것은 아닙니다.</p>
<p>더 큰 크기에서도 같은 비율로 개선된다고 직선으로 연장해서 예측할 수는 없습니다. 1600개 이후의 결과가 필요하다면 실제로 새로운 조건을 시험해야 합니다.</p>
<p>점수 차이는 정확도의 차이이므로 0.30은 30퍼센트포인트에 해당한다는 식으로 단위도 분명히 읽습니다.</p>
<hr /><h2 style="color:#1e3a5f;">4. 낮은 두 선과 큰 간격은 다음 확인을 안내합니다</h2>
<p>훈련과 검증 점수가 모두 낮은 수준에서 거의 변하지 않는다면 자료의 양 외에 모델 표현력이나 특성, 목표와 평가 방식 등을 살펴볼 이유가 있습니다. 훈련 점수는 높은데 검증 점수가 낮고 간격이 크다면 과적합 가능성과 자료 분할 조건을 검토할 수 있습니다.</p>
<p>그러나 그래프의 모양 하나로 원인을 확정해서는 안 됩니다. 같은 낮은 점수라도 잘못된 정답 데이터나 서로 다른 분포, 부적절한 지표가 영향을 줄 수 있기 때문입니다.</p>
<p>가상 예시로 두 정확도가 0.62와 0.60 근처에서 머문다고 해서 모든 문제에서 그 값이 나쁜 성능이라는 뜻은 아닙니다. 해당 문제의 기준 모델과 실제 목표를 함께 봐야 합니다.</p>
<p>선이 가까워졌는지만 보지 말고 어느 수준에서 가까워졌는지도 확인합니다. 두 선이 겹쳤다는 이유로 더 이상 개선할 필요가 없다고 결론 내리지 않습니다.</p>
<p>관찰을 다음 실험의 가설로 바꾸고, 설정 하나를 조정한 결과를 같은 평가 기준에서 다시 비교하는 흐름이 유용합니다.</p>
<p><a href="https://scikit-learn.org/stable/modules/learning_curve.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">5. 평균 곡선 뒤의 분할과 전처리를 확인합니다</h2>
<p>크기별 평균이 매끄럽게 보이더라도 분할마다 점수가 얼마나 달랐는지 확인할 필요가 있습니다. 일부 분할에서만 높은 점수가 나왔다면 평균만으로 효과를 단정하기 어렵습니다.</p>
<p>전처리에서 검증 자료의 정보가 학습 단계에 들어가지 않도록 하는 것도 중요합니다. 평균이나 변환 규칙을 전체 자료로 먼저 맞추고 분할하면 평가 과정에 정보 누수가 생길 수 있으므로 학습 구간 안에서 전처리를 학습하도록 구성합니다.</p>
<p>파이프라인은 이런 절차를 연결하는 데 도움이 됩니다. 같은 사람의 반복 기록이나 시간 순서가 중요한 자료라면 일반 무작위 분할을 그대로 사용할지 먼저 검토해야 합니다.</p>
<p>데이터 양을 바꿀 때 필요한 클래스가 작은 훈련 부분에도 포함되는지 같은 조건도 살펴봅니다. 곡선을 그리는 함수가 분할의 적절성까지 자동으로 판단해 주는 것은 아닙니다.</p>
<p>실험 노트에 표본 선택 방식과 제외된 자료, 전처리 위치를 함께 적으면 그래프를 다시 해석할 근거가 남습니다.</p>
<p><a href="https://scikit-learn.org/stable/common_pitfalls.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">6. 성능뿐 아니라 추가 데이터의 비용도 비교합니다</h2>
<p>데이터가 늘면서 검증 점수가 개선되더라도 학습 시간과 자원 사용이 얼마나 달라지는지 함께 볼 수 있습니다. 공식 예제에서도 표본 수에 따른 학습 시간과 점수의 관계를 비교하는 방법을 보여 줍니다.</p>
<p>실무적인 판단에서는 새로운 데이터를 수집하고 정리하는 비용까지 별도로 고려해야 합니다. 가상으로 800개에서 1600개로 늘리며 정확도가 0.78에서 0.82가 되었다면 개선 폭은 4퍼센트포인트입니다.</p>
<p>그 변화가 목표에 충분히 의미 있는지, 다른 오류 유형은 어떻게 달라졌는지 추가로 확인할 수 있습니다. 같은 수의 행을 복제하는 일과 새로운 정보를 가진 표본을 확보하는 일도 구분해야 합니다.</p>
<p>학습 곡선을 보고 모델 설정을 여러 번 골랐다면 그 검증 결과만으로 최종 성능을 보고하지 않고 독립된 평가 절차를 남겨 둡니다. 학습 곡선은 데이터 수를 정해 주는 정답표가 아니라 관찰한 범위에서 무엇을 다음에 시험할지 정리하는 자료로 사용하는 편이 적절합니다.</p>
<p><a href="https://scikit-learn.org/stable/auto_examples/model_selection/plot_learning_curve.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">7. 자주 묻는 질문</h2>
<h3>Q1. 훈련 점수가 내려가면 학습이 잘못된 것입니까?</h3>
<p>데이터 양이 늘어난 실험에서는 훈련 점수만으로 좋고 나쁨을 판단하지 않습니다. 검증 점수와 두 점수의 간격, 평가 지표를 함께 확인해야 합니다.</p>
<h3>Q2. 에포크별 손실 그래프와 같은 학습 곡선입니까?</h3>
<p>이 글의 학습 곡선은 훈련 표본 수를 바꾸는 실험입니다. 에포크별 그래프는 학습 반복에 따른 변화이므로 가로축과 실험 질문을 구분해서 읽습니다.</p>
<h3>Q3. 두 선이 가까워지면 성능이 충분한 것입니까?</h3>
<p>두 점수가 낮은 수준에서 가까울 수도 있어 간격만으로 판단할 수는 없습니다. 문제의 기준 모델과 목표, 오류 유형까지 함께 비교해야 합니다.</p>
<h3>Q4. 곡선이 좋아지면 데이터를 더 모아도 계속 좋아집니까?</h3>
<p>현재 관찰한 범위의 개선이 이후에도 같은 폭으로 이어진다는 보장은 없습니다. 추가 표본의 구성과 실제 평가 결과, 학습 및 수집 비용을 다시 확인해야 합니다.</p>
<hr /><h2 style="color:#1e3a5f;">참고 자료</h2><ul><li><a href="https://scikit-learn.org/stable/modules/learning_curve.html" rel="nofollow">scikit-learn 학습 곡선과 검증 곡선</a></li><li><a href="https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.learning_curve.html" rel="nofollow">scikit-learn learning_curve 함수</a></li><li><a href="https://scikit-learn.org/stable/common_pitfalls.html" rel="nofollow">scikit-learn 데이터 누수와 파이프라인</a></li><li><a href="https://scikit-learn.org/stable/auto_examples/model_selection/plot_learning_curve.html" rel="nofollow">scikit-learn 학습 곡선과 계산 비용 예제</a></li></ul>]]></description>
<dc:creator>관리자</dc:creator>
<dc:date>2026-10-15T07:21:59+09:00</dc:date>
</item>


<item>
<title>순열 특성 중요도, 입력 열을 섞었을 때 모델 점수가 달라지는 이유</title>
<link>https://nusu.devtechinfo.xyz/blog/%EC%88%9C%EC%97%B4-%ED%8A%B9%EC%84%B1-%EC%A4%91%EC%9A%94%EB%8F%84-%EC%9E%85%EB%A0%A5-%EC%97%B4%EC%9D%84-%EC%84%9E%EC%97%88%EC%9D%84-%EB%95%8C-%EB%AA%A8%EB%8D%B8/</link>
<description><![CDATA[<p>모델이 어떤 입력을 중요하게 사용했는지 설명할 때 특성 중요도 표를 자주 봅니다. 그런데 중요도라는 이름만으로 그 입력이 현실의 원인이라고 해석하거나, 낮은 값을 받은 열을 곧바로 삭제하면 곤란합니다.</p>
<p>순열 특성 중요도는 학습된 모델에 한 열의 값을 섞어 넣었을 때 평가 점수가 얼마나 달라지는지 보는 방법입니다. 이 글은 scikit-learn 공식 자료를 바탕으로 계산의 의미와 한계를 설명합니다.</p>
<p>본문의 점수와 고객 데이터 예시는 이해를 위한 가상 사례이며 실제 모델 성능을 나타내지 않습니다.</p>
<p style="margin:24px 0 8px;"><img src="https://devtechinfo.xyz/data/editor/2610/ai-764ad7eb65dbc818e99d.png" alt="특성 열을 섞는 개념을 표현한 나무 조각 배열" width="1200" height="1024" style="height:auto;" /></p>
<p style="font-size:14px;color:#64748b;margin:0 0 24px;">AI 생성 삽화 · 개념 이해를 위한 AI 연출 이미지이며 실제 시스템 구성도나 측정 결과가 아닙니다.</p>
<blockquote style="border-left:4px solid #1e3a5f;background:#f1f5f9;padding:16px 20px;margin:24px 0;"><p><strong>핵심 정리</strong><br />학습된 모델을 고정한 채 한 특성의 행 순서를 섞고 기준 점수와 비교합니다. 결과는 해당 모델·데이터·평가 지표에 대한 중요도이며, 인과관계나 특성 자체의 절대적 가치를 뜻하지 않습니다.</p></blockquote>
<hr /><h2 style="color:#1e3a5f;">1. 먼저 모델의 기본 성능을 확인합니다</h2>
<p>중요도 계산을 시작하기 전에 모델이 평가할 만한 예측 성능을 보이는지 확인해야 합니다. 잘 작동하지 않는 모델에서 어떤 열을 섞어도 점수가 비슷하다고 해서 그 열이 본래 쓸모없다고 말할 수는 없습니다.</p>
<p>scikit-learn의 안내도 중요도를 계산하기 전에 별도 평가 자료나 교차검증으로 예측 성능을 확인하도록 강조합니다. 중요한 입력을 활용하지 못한 모델일 수도 있기 때문입니다.</p>
<p>분석 기록에는 사용한 모델과 학습 시점, 평가 데이터의 범위를 남깁니다. 학습 자료에서 확인한 중요도와 새로운 자료에서 확인한 중요도는 같은 질문에 대한 결과라고 볼 수 없습니다.</p>
<p>어느 데이터에서의 의존도를 살펴보려는지 먼저 정합니다. 고객의 이탈을 예측하는 가상 모델이라면 어떤 기간의 고객을 대상으로 평가했는지 적을 수 있습니다.</p>
<p>숫자를 만들기 전에 기준 성능과 평가 목적을 정리하면 중요도 표를 과장해서 읽는 일을 줄일 수 있습니다.</p>
<p><a href="https://scikit-learn.org/stable/modules/permutation_importance.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">2. 한 열의 값을 섞고 다른 조건을 유지합니다</h2>
<p>순열 특성 중요도에서는 이미 학습된 모델을 그대로 사용합니다. 예를 들어 고객별 방문 횟수 열의 행 순서를 섞으면 원래 고객과 그 방문 횟수 사이의 연결이 흐트러집니다.</p>
<p>다른 입력 열과 정답은 그대로 둔 채 예측 점수를 다시 계산하는 방식입니다. 각 열을 분석할 때에는 원래 자료를 기준으로 그 열을 섞어야 하며 앞에서 섞은 열들을 계속 누적한 자료로 계산하는 것과 구분합니다.</p>
<p>열 안의 값들을 재배치하는 것이므로 해당 열의 값 목록 자체를 모두 0으로 바꾸는 작업도 아닙니다. 모든 행을 정답과 함께 같은 순서로 섞으면 원래 연결이 유지되므로 다른 실험이 됩니다.</p>
<p>한 특성을 제거하고 모델을 다시 학습하는 방법과도 질문이 다릅니다. 순열 중요도는 현재 모델의 점수가 해당 연결에 얼마나 의존하는지 살펴보는 진단입니다.</p>
<p>재학습 후 성능이 어떻게 바뀔지는 별도의 실험으로 확인해야 합니다.</p>
<p><a href="https://scikit-learn.org/stable/modules/permutation_importance.html" rel="nofollow">관련 공식 문서</a></p>
<p><a href="https://scikit-learn.org/stable/modules/generated/sklearn.inspection.permutation_importance.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">3. 기준 점수와 섞은 뒤 점수의 차이를 계산합니다</h2>
<p>높을수록 좋은 점수를 사용한다고 가정합니다. 가상 모델의 기준 정확도가 0.82이고 한 열을 섞은 뒤 정확도가 0.70이면 차이는 0.12입니다.</p>
<p>정확도 기준으로는 12퍼센트포인트 차이이며 그 특성이 전체 중요도의 12%라는 뜻은 아닙니다. 다른 열을 섞은 뒤 0.81이 나왔다면 같은 조건에서의 차이는 0.01입니다.</p>
<p>scikit-learn의 permutation_importance는 지정한 평가 방식의 기준 점수와 순열 후 점수의 차이를 사용합니다. 실제 프로젝트에서는 정확도 대신 문제에 맞는 지표를 선택할 수 있습니다.</p>
<p>지표가 달라지면 어떤 오류를 중요하게 보는지도 달라지므로 중요도 순위가 같다고 보장할 수 없습니다. 오차처럼 작을수록 좋은 값을 직접 비교할 때에는 부호와 점수화 방식을 특히 확인해야 합니다.</p>
<p>함수가 사용하는 scorer의 의미를 보고 기준 점수와 결과를 함께 기록하면 숫자의 방향을 잘못 읽을 가능성을 줄일 수 있습니다.</p>
<p><a href="https://scikit-learn.org/stable/modules/generated/sklearn.inspection.permutation_importance.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">4. 여러 번 섞은 결과의 변동을 함께 봅니다</h2>
<p>한 번의 섞기에서 나온 숫자만으로 특성의 순위를 확정하면 무작위 변화에 민감할 수 있습니다. 같은 특성을 여러 번 섞어 점수 차이를 모으고 평균과 변동을 살펴볼 수 있습니다.</p>
<p>예를 들어 가상의 세 번 반복에서 차이가 0.10, 0.12, 0.14라면 평균은 0.12입니다. 반면 두 특성의 평균 차이가 매우 작은데 반복별 변동이 크다면 순위 하나로 설명하기보다 비슷한 수준이라고 검토할 수 있습니다.</p>
<p>반복 수와 난수 설정, 사용한 데이터 수를 기록하면 결과를 재현하는 데 도움이 됩니다. 어떤 열은 섞은 뒤 점수가 오르면서 음수 중요도가 나올 수 있습니다.</p>
<p>이를 해당 열이 항상 해롭다는 결론으로 곧바로 바꾸지 말고 표본 변동과 모델의 상태, 입력 관계를 살펴봅니다. 반복 계산은 불확실성을 볼 자료를 주지만 모든 원인을 자동으로 분리해 주는 것은 아닙니다.</p>
<p>결과 표에는 평균만 남기지 말고 반복 결과의 퍼짐도 함께 남기는 편이 좋습니다.</p>
<p><a href="https://scikit-learn.org/stable/modules/generated/sklearn.inspection.permutation_importance.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">5. 서로 비슷한 정보를 담은 열은 해석에 주의합니다</h2>
<p>가상의 자료에 최근 구매 횟수와 비슷한 기간의 주문 수가 함께 들어 있다고 생각해 봅니다. 두 열이 강하게 연결되어 있으면 한 열을 섞어도 모델이 다른 열을 통해 유사한 정보를 사용할 수 있습니다.</p>
<p>그러면 각각의 순열 중요도가 낮게 나올 수 있지만 두 정보가 모두 쓸모없다는 뜻은 아닙니다. scikit-learn의 상관된 특성 예제도 이런 해석 문제를 보여 줍니다.</p>
<p>한 열을 섞는 과정에서 실제 데이터에서는 드문 조합이 만들어질 수 있다는 점도 생각해야 합니다. 중요도를 특성 하나의 독립적인 가치로 읽기 어려운 이유입니다.</p>
<p>관련 열들의 관계와 모델 성능을 함께 보고 추가 분석이나 재학습 실험이 필요한지 판단합니다. 상관이 높다는 이유만으로 어느 열을 무조건 삭제하라는 공통 규칙은 만들지 않습니다.</p>
<p>데이터의 의미와 수집 비용, 실제 사용 조건을 함께 검토해야 합니다. 낮은 중요도는 후속 질문의 출발점으로 사용하는 것이 좋습니다.</p>
<p><a href="https://scikit-learn.org/stable/auto_examples/inspection/plot_permutation_importance_multicollinear.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">6. 설명 자료와 특성 선택 결정을 구분합니다</h2>
<p>순열 중요도는 모델을 살펴보는 데 유용하지만 현실의 인과관계를 증명하지 않습니다. 어떤 열을 섞었을 때 점수가 떨어졌다고 그 값을 실제로 바꾸면 결과가 같은 방향으로 변한다고 보장할 수는 없습니다.</p>
<p>트리 모델의 내부 중요도와도 계산 근거가 다르므로 숫자를 같은 척도로 바로 비교하지 않습니다. 공식 비교 예제는 트리의 불순도 기반 중요도와 순열 중요도가 다르게 나타날 수 있음을 보여 줍니다.</p>
<p>보고서에는 모델 버전, 평가 데이터, 지표, 반복 설정을 중요도 표와 함께 적습니다. 특성 제거를 제안한다면 삭제 후 재학습과 별도 성능 검증을 계획합니다.</p>
<p>유지해야 할 업무 조건이나 데이터 수집 시점이 있는지도 함께 검토합니다. 설명용 순위와 운영 모델을 바꾸는 결정 사이에는 추가 확인이 필요합니다.</p>
<p>순열 중요도를 잘 활용한다는 것은 가장 큰 숫자 하나를 고르는 것이 아니라 현재 모델이 무엇에 의존하는지 질문하고 다음 실험을 정하는 것입니다.</p>
<p><a href="https://scikit-learn.org/stable/auto_examples/inspection/plot_permutation_importance.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">7. 자주 묻는 질문</h2>
<h3>Q1. 열을 섞을 때마다 모델을 다시 학습합니까?</h3>
<p>일반적인 순열 특성 중요도는 학습된 모델을 고정하고 입력을 바꾸어 평가합니다. 열을 제거한 뒤 다시 학습하는 실험은 다른 질문이므로 결과를 구분해서 기록해야 합니다.</p>
<h3>Q2. 중요도 0.12는 전체 영향의 12%라는 뜻입니까?</h3>
<p>선택한 점수의 기준값과 순열 후 값의 차이를 나타냅니다. 본문의 정확도 예시에서는 12퍼센트포인트 차이이며 전체 중요도의 비율로 자동 해석하지 않습니다.</p>
<h3>Q3. 중요도가 낮은 열은 바로 삭제해도 됩니까?</h3>
<p>상관된 다른 열이나 모델의 성능, 평가 조건 때문에 낮게 나타날 수 있습니다. 삭제를 결정하려면 데이터 의미를 검토하고 제거 후 재학습과 별도 성능 검증을 진행해야 합니다.</p>
<h3>Q4. 중요도가 높은 특성이 결과의 원인입니까?</h3>
<p>순열 중요도는 해당 모델의 예측 점수와 입력 연결의 관계를 살펴보는 방법입니다. 현실에서 그 값을 바꾸면 결과가 달라진다는 인과적 결론을 이 점수만으로 내릴 수는 없습니다.</p>
<hr /><h2 style="color:#1e3a5f;">참고 자료</h2><ul><li><a href="https://scikit-learn.org/stable/modules/permutation_importance.html" rel="nofollow">scikit-learn 순열 특성 중요도 개념</a></li><li><a href="https://scikit-learn.org/stable/modules/generated/sklearn.inspection.permutation_importance.html" rel="nofollow">scikit-learn permutation_importance 함수</a></li><li><a href="https://scikit-learn.org/stable/auto_examples/inspection/plot_permutation_importance_multicollinear.html" rel="nofollow">scikit-learn 상관된 특성의 중요도 해석</a></li><li><a href="https://scikit-learn.org/stable/auto_examples/inspection/plot_permutation_importance.html" rel="nofollow">scikit-learn 순열 중요도와 트리 중요도 비교</a></li></ul>]]></description>
<dc:creator>관리자</dc:creator>
<dc:date>2026-10-14T07:21:09+09:00</dc:date>
</item>


<item>
<title>군집 평가의 실루엣 점수, 가까운 이웃과 다른 군집의 거리를 비교하기</title>
<link>https://nusu.devtechinfo.xyz/blog/%EA%B5%B0%EC%A7%91-%ED%8F%89%EA%B0%80%EC%9D%98-%EC%8B%A4%EB%A3%A8%EC%97%A3-%EC%A0%90%EC%88%98-%EA%B0%80%EA%B9%8C%EC%9A%B4-%EC%9D%B4%EC%9B%83%EA%B3%BC-%EB%8B%A4%EB%A5%B8-%EA%B5%B0%EC%A7%91%EC%9D%98/</link>
<description><![CDATA[<p>군집화 결과를 평가할 때는 정답 라벨이 없는 경우가 많습니다. 이때 데이터가 각 집단 안에서 얼마나 모여 있고 다른 집단과 얼마나 떨어져 있는지 살펴보는 지표가 실루엣 점수입니다.</p>
<p>다만 점수가 높다는 사실과 업무에 유용한 집단을 찾았다는 판단은 같지 않습니다. 여기서는 샘플 하나의 거리 비교에서 시작해 전체 평균으로 이어지는 계산과 해석의 한계를 정리합니다.</p>
<p>숫자 예시는 개념을 설명하기 위해 구성한 가상의 거리 값이며 실제 데이터 분석 결과가 아닙니다.</p>
<p style="margin:24px 0 8px;"><img src="https://devtechinfo.xyz/data/editor/2610/ai-33ddac73c37033d821fe.png" alt="세 집단의 나무 구슬과 집단 사이의 구슬로 군집 거리를 비유한 AI 이미지" width="1200" height="1024" style="height:auto;" /></p>
<p style="font-size:14px;color:#64748b;margin:0 0 24px;">AI 생성 삽화 · 개념 이해를 위한 AI 연출 이미지이며 실제 시스템 구성도나 측정 결과가 아닙니다.</p>
<blockquote style="border-left:4px solid #1e3a5f;background:#f1f5f9;padding:16px 20px;margin:24px 0;"><p><strong>핵심 정리</strong><br />실루엣은 같은 군집 내부의 평균 거리 a와 가장 가까운 다른 군집까지의 평균 거리 b를 비교합니다. 전체 평균만 보지 말고 군집별 크기와 샘플별 점수, 사용한 특성과 거리 기준을 함께 확인합니다.</p></blockquote>
<hr /><h2 style="color:#1e3a5f;">1. 군집 이름이 아니라 거리 관계를 평가합니다</h2>
<p>군집화는 샘플을 여러 집단으로 나누는 작업이며 집단 번호 자체에 순위가 있는 것은 아닙니다. 고객 집단을 0과 1로 표시했다고 1이 더 우수한 고객이라는 뜻이 되지는 않습니다.</p>
<p>실루엣 점수는 이런 번호의 의미를 평가하는 대신 주어진 집단 배치와 거리 관계를 살펴봅니다. 같은 군집의 샘플은 서로 가깝고 다른 군집과는 떨어져 있을 때 높은 점수를 기대할 수 있습니다.</p>
<p>이 설명에서 가깝다는 말은 분석자가 사용한 특성과 거리 계산에 의존합니다. 나이와 구매 횟수를 함께 쓰는지, 문서 임베딩을 쓰는지에 따라 비교하는 대상이 달라집니다.</p>
<p>따라서 실루엣을 업무상의 정답률로 읽어서는 안 됩니다. 점수가 높아도 집단을 설명하거나 실제 행동으로 연결하기 어려울 수 있습니다.</p>
<p>지표를 계산하기 전에 무엇을 하나의 샘플로 보고 어떤 특성을 사용했는지 정리하는 것이 해석의 출발점입니다.</p>
<hr /><h2 style="color:#1e3a5f;">2. 같은 군집 내부의 평균 거리 a를 구합니다</h2>
<p>하나의 샘플을 골랐다고 생각해 봅니다. a는 그 샘플과 같은 군집에 속한 다른 샘플들 사이의 거리를 평균한 값입니다.</p>
<p>자기 자신과의 거리를 평균에 넣는다는 뜻은 아닙니다. 이 값이 작으면 선택한 거리 기준에서 자기 군집의 다른 샘플들과 비교적 가까운 상태입니다.</p>
<p>같은 군집의 중심점까지 거리 하나만 재는 계산과도 다릅니다. 예를 들어 한 샘플에서 같은 군집의 다른 두 샘플까지 거리가 1과 3이라면 a는 2입니다.</p>
<p>이 숫자는 설명용 가정이며 어떤 업무에서 2가 작다고 정하는 공통 기준은 아닙니다. 단위와 특성 구성이 바뀌면 거리의 의미도 달라지기 때문입니다.</p>
<p>샘플 하나만 들어 있는 군집처럼 일반적인 평균 계산을 그대로 적용하기 어려운 경우도 있으므로 사용하는 구현의 처리 방식을 확인해야 합니다. 이 글의 손계산은 같은 군집 안에 다른 샘플이 있는 경우를 전제로 합니다.</p>
<p><a href="https://scikit-learn.org/stable/modules/generated/sklearn.metrics.silhouette_score.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">3. 다른 군집까지의 평균 거리 중 가장 작은 값 b를 구합니다</h2>
<p>선택한 샘플에서 다른 군집의 모든 샘플까지 거리를 평균합니다. 다른 군집이 여러 개라면 군집마다 평균을 따로 구한 뒤 가장 작은 평균을 b로 사용합니다.</p>
<p>모든 다른 샘플 가운데 가장 가까운 점 하나까지의 거리와는 다릅니다. 또한 모든 다른 군집을 한데 합친 평균도 아닙니다.</p>
<p>예를 들어 두 다른 군집까지의 평균 거리가 각각 5와 8이면 b는 5입니다. 앞 절의 a가 2라면 이 샘플의 실루엣은 (b-a)/max(a,b), 즉 (5-2)/5인 0.6이 됩니다.</p>
<p>a가 5이고 b가 2인 다른 가상 상황에서는 (2-5)/5인 -0.6입니다. 같은 군집 안보다 다른 군집 쪽에 평균적으로 더 가깝다는 신호로 해석할 수 있습니다.</p>
<p>음수라고 해당 샘플이 반드시 잘못된 데이터라는 뜻은 아니며 군집 배정과 거리 기준을 다시 살펴볼 단서입니다. 두 평균이 같고 양수라면 점수는 0이 됩니다.</p>
<p><a href="https://scikit-learn.org/stable/modules/generated/sklearn.metrics.silhouette_score.html" rel="nofollow">관련 공식 문서</a></p>
<p><a href="https://scikit-learn.org/stable/modules/generated/sklearn.metrics.silhouette_samples.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">4. 전체 평균과 샘플별 점수를 구분합니다</h2>
<p>scikit-learn의 silhouette_score는 샘플별 실루엣 계수의 평균을 반환하며 silhouette_samples는 각 샘플의 값을 반환합니다. 평균이 같아도 일부 군집에 낮은 점수가 몰려 있는지 여부는 다를 수 있습니다.</p>
<p>큰 군집에 높은 점수가 많으면 작은 군집의 어려운 사례가 전체 평균에서 덜 드러날 수도 있습니다. 군집별 표본 수와 점수 분포를 함께 보면 이러한 차이를 살펴볼 수 있습니다.</p>
<p>공식 실루엣 분석 예제는 평균 점수뿐 아니라 군집별 분포와 크기를 함께 보여 줍니다. 프로젝트 보고서에서도 후보별 평균만 한 줄로 적기보다 낮은 점수의 샘플이 어떤 집단에 속하는지 확인하면 좋습니다.</p>
<p>낮은 점수라는 이유로 행부터 제거하면 비교하는 데이터가 달라집니다. 원래 자료의 특성인지 전처리 문제인지 검토한 뒤 필요한 조치를 정해야 합니다.</p>
<p>지표를 올리는 것과 분석 목적에 맞는 군집을 설명하는 것을 함께 살펴봅니다.</p>
<p><a href="https://scikit-learn.org/stable/auto_examples/cluster/plot_kmeans_silhouette_analysis.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">5. 군집 수를 비교할 때 계산 조건을 맞춥니다</h2>
<p>같은 데이터에서 군집 수 후보를 바꾸어 실루엣을 비교할 수 있습니다. 다만 점수가 가장 높은 후보를 모든 상황의 정답으로 선언하지는 않습니다.</p>
<p>군집 수와 별개로 사용할 데이터, 전처리, 거리 기준이 달라지면 점수 차이의 원인을 분리하기 어렵습니다. scikit-learn의 해당 지표는 군집 라벨 수가 2 이상이고 샘플 수보다 적은 조건에서 정의됩니다.</p>
<p>전체를 하나의 군집으로 묶거나 모든 샘플을 각기 다른 군집으로 둔 경우를 같은 방식으로 평가하려 해서는 안 됩니다. 데이터가 커서 일부 샘플로 점수를 계산한다면 표본 추출 조건도 비교표에 남깁니다.</p>
<p>후보마다 다른 표본을 사용하면 결과 차이에 표본 구성이 영향을 줄 수 있습니다. 무작위성이 있는 군집화라면 한 번의 실행 결과만으로 안정성을 판단하지 않고 반복 결과를 검토할 수 있습니다.</p>
<p>이런 조건을 기록해야 다음 사람이 같은 계산을 재현할 수 있습니다.</p>
<p><a href="https://scikit-learn.org/stable/modules/generated/sklearn.metrics.silhouette_score.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">6. 높은 점수가 말해 주지 않는 것도 확인합니다</h2>
<p>실루엣은 선택한 거리에서 조밀하고 분리된 구조를 평가하는 데 유용하지만 모든 군집 모양을 같은 방식으로 다루지는 않습니다. scikit-learn의 군집 평가 안내도 볼록한 형태의 군집에 유리할 수 있다는 한계를 설명합니다.</p>
<p>복잡한 모양의 집단을 다루는 경우에는 낮은 점수가 곧 분석 실패라고 단정할 수 없습니다. 두 차원으로 그린 그림도 원래의 모든 특성과 거리 관계를 그대로 보여 주는 것은 아니므로 보조 자료로 사용합니다.</p>
<p>업무적으로 필요한 집단 수와 각 집단을 설명할 수 있는 특성도 함께 검토합니다. 예를 들어 가상의 고객 분석에서는 점수가 약간 높은 두 집단보다 운영 목적에 맞는 세 집단이 더 유용할 가능성도 검토할 수 있습니다.</p>
<p>이것은 세 집단이 더 좋다는 일반 규칙이 아니라 지표와 목적을 함께 보라는 뜻입니다. 보고서에는 점수, 계산 조건, 군집별 설명, 남은 한계를 나란히 제시합니다.</p>
<p>실루엣은 군집화를 끝내 주는 판정표가 아니라 결과를 질문하고 비교하는 도구입니다.</p>
<p><a href="https://scikit-learn.org/stable/modules/clustering.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">7. 자주 묻는 질문</h2>
<h3>Q1. 실루엣 점수 0.6은 정답률 60%라는 뜻입니까?</h3>
<p>정답 라벨과 비교한 비율이 아니라 같은 군집과 다른 군집의 거리 관계를 요약한 값입니다. 선택한 특성과 거리 기준 아래에서 해석해야 하며 업무상 정확도를 직접 뜻하지 않습니다.</p>
<h3>Q2. b는 가장 가까운 다른 점까지의 거리입니까?</h3>
<p>다른 군집별 평균 거리 가운데 가장 작은 값을 뜻합니다. 다른 샘플 하나까지의 최소 거리나 모든 다른 군집을 합친 평균 거리로 계산하면 정의와 달라집니다.</p>
<h3>Q3. 군집을 많이 만들수록 점수가 높아집니까?</h3>
<p>군집 수를 늘린다고 점수가 반드시 높아지는 것은 아닙니다. 동일한 데이터와 거리 조건에서 후보를 비교하고 군집별 크기와 점수 분포, 실제 활용 목적을 함께 검토해야 합니다.</p>
<h3>Q4. 음수 점수의 샘플은 모두 삭제해야 합니까?</h3>
<p>음수라는 사실만으로 잘못된 데이터라고 판단할 수는 없습니다. 군집 배정과 특성·거리 기준, 해당 샘플의 맥락을 살펴보고 삭제가 필요하다면 점수 개선과 별개의 근거를 남깁니다.</p>
<hr /><h2 style="color:#1e3a5f;">참고 자료</h2><ul><li><a href="https://scikit-learn.org/stable/modules/generated/sklearn.metrics.silhouette_score.html" rel="nofollow">scikit-learn silhouette_score</a></li><li><a href="https://scikit-learn.org/stable/modules/generated/sklearn.metrics.silhouette_samples.html" rel="nofollow">scikit-learn silhouette_samples</a></li><li><a href="https://scikit-learn.org/stable/auto_examples/cluster/plot_kmeans_silhouette_analysis.html" rel="nofollow">scikit-learn 실루엣 분석 예제</a></li><li><a href="https://scikit-learn.org/stable/modules/clustering.html" rel="nofollow">scikit-learn 군집 평가와 한계</a></li></ul>]]></description>
<dc:creator>관리자</dc:creator>
<dc:date>2026-10-13T07:18:42+09:00</dc:date>
</item>


<item>
<title>회귀 평가의 MAE와 RMSE, 큰 오차가 점수에 미치는 영향</title>
<link>https://nusu.devtechinfo.xyz/blog/%ED%9A%8C%EA%B7%80-%ED%8F%89%EA%B0%80%EC%9D%98-mae%EC%99%80-rmse-%ED%81%B0-%EC%98%A4%EC%B0%A8%EA%B0%80-%EC%A0%90%EC%88%98%EC%97%90-%EB%AF%B8%EC%B9%98%EB%8A%94/</link>
<description><![CDATA[<p>회귀 모델의 평가표에서 MAE는 비슷한데 RMSE는 크게 다른 결과를 볼 수 있습니다. 이때 어느 계산이 잘못되었다고 보기 전에 모델이 어떤 크기의 오차를 만들었는지 살펴봐야 합니다.</p>
<p>두 지표는 모두 실제값과 예측값의 차이를 요약하지만 큰 오차를 반영하는 방식이 다릅니다. 여기서는 하나의 수치 목표를 예측하고 모든 샘플에 같은 가중치를 주는 경우를 기준으로 설명합니다.</p>
<p>수치 예시는 원리를 보여 주기 위해 직접 구성한 가상 데이터이며 실제 서비스 성능을 나타내지 않습니다.</p>
<p style="margin:24px 0 8px;"><img src="https://devtechinfo.xyz/data/editor/2610/ai-ac152d11a6063d9d420b.png" alt="길이가 다른 막대로 오차 크기의 차이를 표현한 AI 개념 이미지" width="1200" height="1024" style="height:auto;" /></p>
<p style="font-size:14px;color:#64748b;margin:0 0 24px;">AI 생성 삽화 · 개념 이해를 위한 AI 연출 이미지이며 실제 시스템 구성도나 측정 결과가 아닙니다.</p>
<blockquote style="border-left:4px solid #1e3a5f;background:#f1f5f9;padding:16px 20px;margin:24px 0;"><p><strong>핵심 정리</strong><br />MAE는 절대오차를 평균하고 RMSE는 제곱오차를 평균한 뒤 제곱근을 구합니다. 한쪽 점수만으로 모델을 고르기보다 같은 평가 데이터에서 두 값과 큰 오차의 위치를 함께 확인합니다.</p></blockquote>
<hr /><h2 style="color:#1e3a5f;">1. 먼저 샘플별 오차를 만듭니다</h2>
<p>배송 시간을 예측하는 가상의 모델을 생각해 봅니다. 실제 시간이 10분이고 예측이 12분이면 예측값에서 실제값을 뺀 오차는 2분입니다.</p>
<p>실제가 10분인데 예측이 8분이면 오차는 마이너스 2분입니다. 두 오차를 부호 그대로 평균하면 0이 되지만 두 예측이 모두 정확했던 것은 아닙니다.</p>
<p>그래서 오차의 크기를 평가할 때는 양수와 음수가 상쇄되지 않도록 절댓값이나 제곱을 사용합니다. 부호를 없앤 점수만으로는 과대 예측과 과소 예측 중 어느 쪽이 많은지 알 수 없다는 점도 기억해야 합니다.</p>
<p>예측값과 실제값의 순서가 서로 맞는지 확인하는 과정이 계산보다 먼저입니다. 같은 고객의 예측에 다른 고객의 실제값을 붙이면 공식이 정확해도 지표는 의미를 잃습니다.</p>
<p>평가 자료에는 샘플을 식별할 기준과 예측 시점을 함께 남기는 편이 결과를 추적하기 쉽습니다.</p>
<hr /><h2 style="color:#1e3a5f;">2. MAE는 절대오차의 평균입니다</h2>
<p>MAE는 각 오차에 절댓값을 취한 뒤 모두 더하고 샘플 수로 나누어 계산합니다. 절대오차가 1분, 1분, 1분, 5분이라면 합계 8분을 네 개로 나누어 MAE는 2분이 됩니다.</p>
<p>이를 평균적인 절대 차이가 2분이라고 읽을 수 있지만 모든 예측이 2분 이내였다는 뜻으로 읽으면 안 됩니다. 예시에는 실제로 5분의 오차가 있는 샘플이 포함되어 있습니다.</p>
<p>같은 네 샘플에서 절대오차가 모두 2분이어도 MAE는 똑같이 2분입니다. 따라서 MAE 하나만 놓고 두 결과의 오차 분포가 같다고 말할 수는 없습니다.</p>
<p>scikit-learn의 mean_absolute_error 함수는 실제값과 예측값을 받아 이 지표를 계산하며, 기본적으로 값이 작을수록 절대오차가 작습니다. 함수에는 샘플 가중치와 다중 출력 집계 옵션도 있으므로 다른 사람이 만든 평가표와 비교할 때 설정을 확인해야 합니다.</p>
<p>여기의 손계산은 가중치를 주지 않은 단일 출력 예시입니다.</p>
<p><a href="https://scikit-learn.org/stable/modules/generated/sklearn.metrics.mean_absolute_error.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">3. RMSE에서는 큰 오차의 영향이 달라집니다</h2>
<p>RMSE는 오차를 제곱한 값들의 평균인 MSE에 제곱근을 취한 결과입니다. 앞의 절대오차 1, 1, 1, 5를 제곱하면 1, 1, 1, 25이고 평균은 7입니다.</p>
<p>따라서 RMSE는 7의 제곱근인 약 2.65분입니다. 반면 절대오차가 모두 2분인 경우 제곱오차는 모두 4이고 RMSE는 2분입니다.</p>
<p>MAE는 같아도 큰 오차가 포함된 첫 번째 결과의 RMSE가 더 크게 나타납니다. 이 차이는 제곱하는 단계에서 큰 오차가 상대적으로 더 큰 비중을 갖기 때문에 생깁니다.</p>
<p>마지막에 제곱근을 취하므로 RMSE의 단위는 목표값과 같고, MSE의 단위는 그 제곱입니다. root_mean_squared_error는 scikit-learn에서 RMSE를 구하는 함수입니다.</p>
<p>숫자가 더 크다는 이유만으로 MAE보다 정확한 지표라고 표현하기보다 어떤 오차를 강조하는 계산인지 이해하는 것이 좋습니다.</p>
<p><a href="https://scikit-learn.org/stable/modules/generated/sklearn.metrics.root_mean_squared_error.html" rel="nofollow">관련 공식 문서</a></p>
<p><a href="https://scikit-learn.org/stable/modules/model_evaluation.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">4. 같은 데이터와 같은 단위로 비교합니다</h2>
<p>모델 A를 평일 데이터로 평가하고 모델 B를 주말 데이터로 평가하면 점수 차이를 모델 차이만으로 해석하기 어렵습니다. 비교할 샘플과 목표값의 단위, 가중치, 제외한 행의 기준을 맞추어야 합니다.</p>
<p>분을 초로 바꾸면 MAE와 RMSE도 그에 맞춰 숫자가 커지므로 서로 다른 단위의 표를 그대로 비교해서는 안 됩니다. 학습에 사용한 데이터에서 얻은 좋은 점수도 새로운 데이터에서의 성능을 보장하지 않습니다.</p>
<p>학습과 평가를 분리하고 모델을 선택하는 데 쓴 자료와 최종 평가 자료의 역할을 구분해야 합니다. scikit-learn의 교차검증 안내도 학습 자료로 그대로 평가할 때의 문제와 평가 자료에 맞추어 설정을 조정하는 위험을 설명합니다.</p>
<p>평가표에는 사용한 데이터 기간과 샘플 수를 함께 적습니다. 점수가 바뀌었을 때 코드 변화 때문인지 자료 변화 때문인지 추적할 수 있도록 계산 조건을 남기는 것이 좋습니다.</p>
<p><a href="https://scikit-learn.org/stable/modules/cross_validation.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">5. 차이가 큰 샘플을 살펴보되 임의로 지우지 않습니다</h2>
<p>MAE에 비해 RMSE가 크게 보이면 일부 큰 오차가 영향을 주는지 샘플별 결과를 확인할 수 있습니다. 다만 두 숫자의 차이만으로 데이터 오류나 특정 원인을 확정할 수는 없습니다.</p>
<p>실제값의 입력 문제인지, 예측 대상이 다른 조건에 속했는지, 드물지만 정상적으로 발생한 사례인지 조사해야 합니다. 예를 들어 가상 배송 자료에서 특정 시간대의 오차가 크다면 그 시간대의 샘플 수와 예측값을 따로 볼 수 있습니다.</p>
<p>점수가 좋아진다는 이유로 큰 오차의 행부터 삭제하면 평가하려는 문제 자체가 달라집니다. 제외가 필요하다면 이유와 적용 기준을 기록하고 비교 대상에도 같은 기준을 적용해야 합니다.</p>
<p>전체 점수와 함께 큰 오차 사례를 몇 개 살펴보면 평균이 숨기는 문제를 찾는 데 도움이 됩니다. 과대 예측과 과소 예측을 구분한 표도 두 지표만으로 알 수 없는 방향 정보를 보완합니다.</p>
<p>숫자의 개선이 실제 사용상의 개선과 이어지는지 검토할 자료를 함께 남깁니다.</p>
<hr /><h2 style="color:#1e3a5f;">6. 모델을 고르는 기준을 먼저 정합니다</h2>
<p>큰 실패를 줄이는 일이 특히 중요한 문제라면 RMSE와 큰 오차 사례를 비중 있게 살펴볼 수 있습니다. 일반적인 절대 차이를 이해하기 쉽게 설명하려면 MAE가 유용한 출발점입니다.</p>
<p>그렇다고 모든 프로젝트에 한 지표가 항상 더 좋다고 정할 수는 없습니다. 가상의 모델 A가 대부분의 배송을 가깝게 맞히지만 일부에서 크게 틀리고, B가 비교적 고르게 틀린다면 어떤 결과가 더 부담스러운지 서비스 맥락을 살펴야 합니다.</p>
<p>모델을 본 뒤 유리한 지표만 고르는 대신 비교 전에 평가 기준을 합의하는 편이 좋습니다. 보고서에는 MAE와 RMSE를 같은 단위로 적고 주요 오차 사례와 계산 조건을 함께 설명합니다.</p>
<p>두 지표가 모두 낮아졌더라도 중요한 사용자 집단의 결과가 나빠지지 않았는지 추가로 살펴볼 수 있습니다. 최종 선택은 하나의 숫자 순위를 외우는 과정이 아니라 모델의 오차가 실제 문제에서 무엇을 뜻하는지 연결하는 과정입니다.</p>
<hr /><h2 style="color:#1e3a5f;">7. 자주 묻는 질문</h2>
<h3>Q1. RMSE가 MAE보다 작을 수도 있습니까?</h3>
<p>이 글처럼 같은 샘플의 단일 출력 오차에 같은 비음수 가중치를 적용해 계산하면 RMSE는 MAE보다 작지 않습니다. 반대 결과가 나왔다면 데이터, 가중치, 출력 집계 방식과 단위가 같은지 먼저 확인해야 합니다.</p>
<h3>Q2. MAE가 2분이면 모든 예측이 2분 안에 맞습니까?</h3>
<p>절대오차의 평균이 2분이라는 뜻이므로 개별 예측의 최대 오차를 보장하지 않습니다. 본문의 1, 1, 1, 5분 예시도 MAE가 2분이므로 샘플별 결과나 큰 오차의 빈도를 함께 봅니다.</p>
<h3>Q3. 큰 오차가 있으면 평가 자료에서 빼도 됩니까?</h3>
<p>큰 오차라는 사실만으로 제외 근거가 되지는 않습니다. 잘못된 관측인지 정상적인 어려운 사례인지 확인하고, 제외한다면 기준과 제외 전후 결과를 기록해 평가 범위가 바뀌었음을 설명해야 합니다.</p>
<h3>Q4. 목표값을 변환해 학습했다면 어느 단위로 평가합니까?</h3>
<p>무엇을 평가하려는지에 맞춰 단위를 정하고 보고서에 명시해야 합니다. 원래 시간 단위의 차이를 설명하려면 예측값과 실제값을 같은 원래 단위로 맞추어 계산하며 변환 공간의 점수와 혼용하지 않습니다.</p>
<hr /><h2 style="color:#1e3a5f;">참고 자료</h2><ul><li><a href="https://scikit-learn.org/stable/modules/generated/sklearn.metrics.mean_absolute_error.html" rel="nofollow">scikit-learn mean_absolute_error</a></li><li><a href="https://scikit-learn.org/stable/modules/generated/sklearn.metrics.root_mean_squared_error.html" rel="nofollow">scikit-learn root_mean_squared_error</a></li><li><a href="https://scikit-learn.org/stable/modules/model_evaluation.html" rel="nofollow">scikit-learn 회귀 평가 지표</a></li><li><a href="https://scikit-learn.org/stable/modules/cross_validation.html" rel="nofollow">scikit-learn 교차검증과 평가 데이터</a></li></ul>]]></description>
<dc:creator>관리자</dc:creator>
<dc:date>2026-10-12T07:18:35+09:00</dc:date>
</item>


<item>
<title>결측값 대치와 결측 표시, 비어 있는 데이터에서 무엇을 남길까요</title>
<link>https://nusu.devtechinfo.xyz/blog/%EA%B2%B0%EC%B8%A1%EA%B0%92-%EB%8C%80%EC%B9%98%EC%99%80-%EA%B2%B0%EC%B8%A1-%ED%91%9C%EC%8B%9C-%EB%B9%84%EC%96%B4-%EC%9E%88%EB%8A%94-%EB%8D%B0%EC%9D%B4%ED%84%B0%EC%97%90%EC%84%9C-%EB%AC%B4%EC%97%87%EC%9D%84/</link>
<description><![CDATA[<p>머신러닝 데이터의 빈칸을 평균으로 채우면 입력 형태는 정리되지만, 원래 값이 없었다는 정보는 사라질 수 있습니다. 결측값 대치는 비어 있는 자리에 사용할 값을 정하는 작업이고, 결측 표시는 어떤 값이 원래 없었는지 별도 특성으로 남기는 작업입니다.</p>
<p>두 처리는 함께 사용할 수 있지만 목적은 다릅니다. scikit-learn 공식 문서를 바탕으로 대치값의 의미와 학습·평가에서 확인할 조건을 정리합니다.</p>
<p style="margin:24px 0 8px;"><img src="https://devtechinfo.xyz/data/editor/2610/ai-eb7b766e7a4527de42db.png" alt="빠진 칸이 있는 타일 배열로 표현한 결측값 개념" width="1200" height="1024" style="height:auto;" /></p>
<p style="font-size:14px;color:#64748b;margin:0 0 24px;">AI 생성 삽화 · 개념 이해를 위한 AI 연출 이미지이며 실제 시스템 구성도나 측정 결과가 아닙니다.</p>
<blockquote style="border-left:4px solid #1e3a5f;background:#f1f5f9;padding:16px 20px;margin:24px 0;"><p><strong>핵심 정리</strong><br />채운 숫자는 새로 관측한 사실이 아닙니다. 대치 규칙은 학습 자료에서 정하고, 결측 표시를 추가할지는 결측의 의미와 평가 결과를 함께 검토해 결정합니다.</p></blockquote>
<hr /><h2 style="color:#1e3a5f;">1. 빈칸을 어떤 의미로 저장했는지 먼저 봅니다</h2>
<p>가상의 이용 기록에서 사용 시간을 적지 않은 행과 사용 시간이 실제로 0인 행은 다를 수 있습니다. 전자는 값을 모르는 상태이고 후자는 관측값이 0인 상태입니다.</p>
<p>파일에서 둘 다 0으로 저장했다면 이후 처리만으로 원래 의미를 쉽게 복원할 수 없을 수 있습니다. 수집 단계에서 NaN이나 별도 표식, 빈 문자열 중 무엇을 결측으로 썼는지 확인해야 합니다.</p>
<p>같은 파일 안에서도 열마다 의미가 다를 수 있으므로 데이터 설명을 함께 읽습니다. 예를 들어 선택 질문에 답하지 않은 것과 장비에서 값이 전달되지 않은 것은 다른 확인 질문을 만듭니다.</p>
<p>결측이 있다는 사실만으로 데이터가 모두 쓸모없다고 판단하지 않습니다. 반대로 값이 채워져 보인다고 관측 품질 문제가 해결된 것도 아닙니다.</p>
<p>원본을 보존하고 어떤 값들을 결측으로 해석했는지 규칙을 남깁니다. 이후 실험의 차이를 설명하려면 시작 상태가 무엇이었는지 다시 확인할 수 있어야 합니다.</p>
<hr /><h2 style="color:#1e3a5f;">2. 대치값은 계산 규칙으로 만든 입력입니다</h2>
<p>SimpleImputer는 열별 평균이나 중앙값, 최빈값 또는 정한 상수 같은 전략으로 결측을 채울 수 있습니다. 평균과 중앙값 전략은 숫자 자료에 적용하는 방식이며 모든 문자열 열에 그대로 쓸 수 있는 옵션이 아닙니다.</p>
<p>가상의 관측값이 2, 4, 9라면 평균 대치값은 5이고 중앙값은 4입니다. 비어 있는 행에 5를 넣었다고 그 사람의 실제 값이 5였다는 사실을 알아낸 것은 아닙니다.</p>
<p>계산 규칙이 선택한 대체 입력일 뿐입니다. 같은 열에서 많은 값을 동일한 숫자로 채우면 원래 관측과 대치 결과의 구분을 따로 생각해야 합니다.</p>
<p>어떤 전략이 항상 우수하다고 정하지 않고 자료의 의미와 모델 결과를 비교합니다. 사용한 전략, 결측 표식과 학습된 대치값을 기록하면 재현에 도움이 됩니다.</p>
<p>설명을 위해 제시한 숫자는 실제 자료의 통계가 아닙니다. 대치 후 파일과 관측 원본을 같은 이름으로 덮어쓰지 않는 편이 좋습니다.</p>
<p><a href="https://scikit-learn.org/stable/modules/generated/sklearn.impute.SimpleImputer.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">3. 결측 표시는 원래 비어 있었는지를 남깁니다</h2>
<p>MissingIndicator는 결측 여부에 대응하는 이진 정보를 만들 수 있습니다. 원래 값과 대치값이 같아 보이더라도 결측 표식이 있으면 둘의 출처를 구분할 수 있습니다.</p>
<p>가상의 사용 시간 열에 실제 5가 있던 행과 평균 5로 채운 행이 있다면 숫자만으로는 같지만 결측 여부는 다릅니다. 이것은 왜 비었는지까지 설명하는 정보는 아닙니다.</p>
<p>기록 누락과 응답 거절을 구분하려면 그에 맞는 원본 자료가 별도로 있어야 합니다. 결측 표시가 모델에 도움이 될 수 있다는 가능성과 모든 문제에서 성능을 높인다는 주장은 다릅니다.</p>
<p>표시가 데이터 수집 과정의 우연한 흔적을 반영하는지도 확인할 필요가 있습니다. 학습 때만 나타난 수집 방식이 서비스에서 바뀐다면 그 차이는 별도의 검토 항목입니다.</p>
<p>입문 실험에서는 대치만 한 경우와 표시를 함께 둔 경우를 같은 조건에서 비교하면 기능의 역할을 보기 쉽습니다.</p>
<p><a href="https://scikit-learn.org/stable/modules/impute.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">4. 학습에서 정한 규칙을 평가 자료에 적용합니다</h2>
<p>scikit-learn의 권장 실무 안내는 전처리에서도 평가 자료의 정보를 학습에 섞지 않도록 설명합니다. 평균 대치를 한다면 학습 구간에서 평균을 정하고 평가 구간에는 그 규칙을 적용합니다.</p>
<p>전체 자료의 평균을 먼저 구한 뒤 분할하면 평가 자료의 값이 대치값 계산에 참여합니다. 가상의 학습 관측이 2와 4이고 평가 관측이 100이라면 학습 평균 3과 전체 평균은 크게 다릅니다.</p>
<p>이 예시는 규칙을 만드는 자료 범위가 왜 중요한지 보여 주는 계산입니다. 교차 검증에서도 각 학습 구간 안에서 대치 규칙을 맞추는지 확인합니다.</p>
<p>파이프라인을 사용하는 것은 이런 처리를 모델 학습과 연결하는 데 도움이 되지만 이미 전체 자료로 바꿔 둔 값을 자동으로 되돌리지는 않습니다. fit과 transform이 어느 자료에 호출되는지 기록합니다.</p>
<p>성능 비교에서 대치 규칙 외의 설정도 바뀌었다면 같은 실험이라고 부르지 않고 변경 항목을 남깁니다.</p>
<p><a href="https://scikit-learn.org/stable/common_pitfalls.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">5. 표시 열이 언제 생성되는지 확인합니다</h2>
<p>SimpleImputer의 add_indicator=True는 대치 결과에 결측 표시를 덧붙이는 옵션입니다. 공식 문서는 학습 시 결측이 없었던 특성에는 나중에 결측이 생겨도 이 옵션의 표시 열이 추가되지 않는다고 설명합니다.</p>
<p>따라서 모든 원본 열에 항상 하나씩 표시가 생긴다고 가정하면 안 됩니다. 변환 후 열 이름과 개수를 확인하고 모델 입력 순서와 연결해야 합니다.</p>
<p>결측 표시를 별도 도구로 구성하는 경우에도 어떤 열을 대상으로 만들었는지 확인합니다. 학습 때 한 열 전체가 비어 있는 경우의 처리도 사용하는 설정과 버전에서 별도로 살펴야 합니다.</p>
<p>빈 열이 자동으로 원하는 형태로 유지될 것이라고 가정하지 않습니다. 원본 열 수와 변환 후 열 수를 기록하고 서비스 입력에서도 같은 구조를 기대하는지 점검합니다.</p>
<p>결측 처리 오류는 숫자가 잘못된 경우뿐 아니라 열의 의미가 어긋나는 형태로도 드러날 수 있습니다. 코드에서 열 위치만 외우기보다 변환 결과를 이름과 함께 확인하는 편이 좋습니다.</p>
<p><a href="https://scikit-learn.org/stable/modules/generated/sklearn.impute.SimpleImputer.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">6. 모델 점수와 수집 상태를 함께 검토합니다</h2>
<p>결측 처리를 비교할 때는 전체 점수와 함께 어떤 열에서 얼마나 비어 있었는지 기록합니다. 대치 후 점수가 좋아졌더라도 그 효과가 모든 사용 조건에서 유지되는지는 별도 평가가 필요합니다.</p>
<p>결측이 있는 사례와 없는 사례를 나누어 살펴보면 추가 질문을 찾는 데 도움이 될 수 있습니다. 이 비교는 자료 수가 충분한지와 평가 목적을 고려해 해석해야 합니다.</p>
<p>결측을 직접 다룰 수 있는 모델도 있으므로 모든 모델 앞에 대치를 반드시 넣는다고 정하지 않습니다. 사용하는 모델의 지원 조건을 공식 문서에서 확인합니다.</p>
<p>어떤 방법을 선택했든 원래 없던 값을 관측한 값처럼 보고하지 않습니다. 서비스에서는 입력 누락 비율이 달라지는지와 변환 과정이 기대한 구조를 만드는지 확인할 계획을 둡니다.</p>
<p>수집 오류를 고칠 수 있다면 전처리만 바꾸는 것과 다른 개선으로 기록합니다. 결측 처리는 빈칸을 없애는 완료 표시보다 어떤 정보를 바꿨고 무엇을 남겼는지 설명할 수 있어야 합니다.</p>
<p><a href="https://scikit-learn.org/stable/modules/impute.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">7. 자주 묻는 질문</h2>
<h3>Q1. 평균으로 채우면 원래 값이 복원된 것인가요?</h3>
<p>평균 대치는 정한 계산 규칙으로 입력값을 채운 것이며 실제 관측값을 알아낸 것은 아닙니다. 원본과 변환 결과를 구분하고 대치 전략 및 적용 범위를 기록합니다.</p>
<h3>Q2. 결측 표시를 추가하면 항상 더 좋아지나요?</h3>
<p>항상 성능을 높인다고 보장할 수 없으며 자료의 의미와 모델 조건에 따라 평가해야 합니다. 대치만 한 경우와 표시를 더한 경우를 같은 평가 자료에서 비교합니다.</p>
<h3>Q3. 테스트 자료의 평균으로 빈칸을 채워도 되나요?</h3>
<p>일반적인 지도학습 평가에서는 학습 자료에서 정한 전처리 규칙을 평가 자료에 적용합니다. 평가 자료를 이용해 규칙을 새로 맞추지 않았는지 fit과 transform의 대상을 확인합니다.</p>
<h3>Q4. add_indicator를 켜면 모든 열에 표시가 붙나요?</h3>
<p>SimpleImputer에서는 학습 시 결측이 없던 특성에 나중에 결측이 생겨도 해당 표시 열이 추가되지 않습니다. 변환 후 열 이름과 개수를 확인하고 필요한 표시 구성을 별도로 검토합니다.</p>
<hr /><h2 style="color:#1e3a5f;">참고 자료</h2><ul><li><a href="https://scikit-learn.org/stable/modules/impute.html" rel="nofollow">scikit-learn: 결측값 대치와 표시</a></li><li><a href="https://scikit-learn.org/stable/modules/generated/sklearn.impute.SimpleImputer.html" rel="nofollow">scikit-learn: SimpleImputer</a></li><li><a href="https://scikit-learn.org/stable/common_pitfalls.html" rel="nofollow">scikit-learn: 전처리와 데이터 누수 주의 사항</a></li></ul>]]></description>
<dc:creator>관리자</dc:creator>
<dc:date>2026-10-10T07:22:36+09:00</dc:date>
</item>


<item>
<title>클래스 가중치와 재표본화, 불균형 학습을 조정하는 두 방법</title>
<link>https://nusu.devtechinfo.xyz/blog/%ED%81%B4%EB%9E%98%EC%8A%A4-%EA%B0%80%EC%A4%91%EC%B9%98%EC%99%80-%EC%9E%AC%ED%91%9C%EB%B3%B8%ED%99%94-%EB%B6%88%EA%B7%A0%ED%98%95-%ED%95%99%EC%8A%B5%EC%9D%84-%EC%A1%B0%EC%A0%95%ED%95%98%EB%8A%94-%EB%91%90-%EB%B0%A9%EB%B2%95/</link>
<description><![CDATA[<p>분류 데이터에서 어떤 클래스는 많고 다른 클래스는 적을 때, 학습에 어떤 조정을 할지 고민하게 됩니다. 클래스 가중치는 학습에서 각 클래스가 반영되는 비중을 조정하고, 재표본화는 학습에 제공할 표본 구성을 바꾸는 접근입니다.</p>
<p>둘은 같은 목적에 쓰일 수 있지만 동일한 작업은 아닙니다. 무엇을 바꿨는지와 평가 자료를 어떻게 남겼는지를 구분해야 실험 결과를 제대로 비교할 수 있습니다.</p>
<p style="margin:24px 0 8px;"><img src="https://devtechinfo.xyz/data/editor/2610/ai-8ad032b6bb824e9fbd7d.png" alt="서로 다른 수량의 색상 블록과 노트북이 놓인 학습 책상" width="1200" height="1024" style="height:auto;" /></p>
<p style="font-size:14px;color:#64748b;margin:0 0 24px;">AI 생성 삽화 · 개념 이해를 위한 AI 연출 이미지이며 실제 시스템 구성도나 측정 결과가 아닙니다.</p>
<blockquote style="border-left:4px solid #1e3a5f;background:#f1f5f9;padding:16px 20px;margin:24px 0;"><p><strong>핵심 정리</strong><br />가중치는 클래스의 학습 비중을, 재표본화는 학습 표본 구성을 조정합니다. 먼저 데이터를 나누고 학습 구간에서만 조정을 적용하며 같은 평가 집합으로 효과를 비교합니다.</p></blockquote>
<hr /><h2 style="color:#1e3a5f;">1. 비율이 다르다는 사실과 문제 정의를 구분합니다</h2>
<p>가상의 분류 자료에 일반 사례 900개와 관심 사례 100개가 있다고 생각해 봅니다. 관심 사례가 적다는 사실만으로 두 클래스를 반드시 같은 개수로 만들어야 한다는 결론이 나오지는 않습니다.</p>
<p>실제 서비스에서 어떤 오류를 줄여야 하는지와 자료가 어떻게 수집됐는지를 먼저 살펴야 합니다. 모든 입력을 일반 사례라고 답해도 이 가상 자료에서는 정확도가 90%가 되지만 관심 사례를 하나도 찾지 못합니다.</p>
<p>이는 계산을 설명하기 위한 예시이며 실제 모델 성능이 아닙니다. 관심 사례를 놓치는 것과 일반 사례를 잘못 알리는 것의 영향을 나누어 평가 목표를 정합니다.</p>
<p>학습 조정을 하기 전 기준 모델과 클래스별 결과를 기록하면 무엇이 달라졌는지 비교하기 쉽습니다. 자료 수가 적은 이유가 수집 누락인지 원래 드문 사건인지도 확인할 질문입니다.</p>
<p>숫자의 균형을 맞추는 작업이 잘못된 정답이나 누락된 특성을 자동으로 해결하지는 않습니다. 어떤 문제를 해결하려는 실험인지 먼저 문장으로 적어 두는 것이 좋습니다.</p>
<hr /><h2 style="color:#1e3a5f;">2. 클래스 가중치는 원본 행을 늘리는 기능이 아닙니다</h2>
<p>클래스 가중치를 지원하는 모델에서는 클래스별 비중을 학습에 반영할 수 있습니다. 예를 들어 scikit-learn의 로지스틱 회귀는 class_weight 설정을 제공합니다.</p>
<p>설정을 넣었다고 원본 데이터 파일의 행이 자동으로 늘어나는 것은 아닙니다. 학습 알고리즘이 가중치를 어떻게 사용하고 다른 가중치와 어떻게 결합하는지는 해당 모델의 문서를 확인해야 합니다.</p>
<p>모든 모델이 같은 이름과 방식으로 지원한다고 가정하지 않습니다. 가상의 실험에서 관심 클래스에 더 큰 비중을 주었다면 그 값과 선택 근거를 기록합니다.</p>
<p>값이 크다는 이유만으로 관심 클래스의 실제 사례가 새로 생긴 것은 아닙니다. 같은 소수 사례에서 배우는 정보의 범위에는 여전히 한계가 있을 수 있습니다.</p>
<p>가중치를 바꾼 실행과 바꾸지 않은 실행을 같은 평가 자료에서 비교하고 다른 설정까지 동시에 바꾸었다면 별도 실험으로 구분합니다. 학습 비중을 조정하는 것과 최종 예측의 임계값을 바꾸는 것도 다른 단계입니다.</p>
<p><a href="https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">3. balanced 설정의 계산 기준을 확인합니다</h2>
<p>scikit-learn의 compute_class_weight는 balanced 방식에서 클래스 빈도에 반비례하는 가중치를 계산하는 규칙을 제공합니다. 표본 가중치를 주지 않은 경우 전체 표본 수를 클래스 수와 해당 클래스 표본 수의 곱으로 나누는 방식입니다.</p>
<p>앞의 가상 자료 1,000개와 두 클래스를 사용하면 900개인 클래스의 값은 약 0.556, 100개인 클래스의 값은 5가 됩니다. 두 클래스의 단순 합산 가중치는 각각 약 500으로 맞춰지는 계산입니다.</p>
<p>이것이 모든 업무에서 최적인 비용 비율이라는 뜻은 아닙니다. 계산 규칙이 정한 균형과 서비스에서 중요하게 보는 오류의 비용은 구분해야 합니다.</p>
<p>어떤 자료로 빈도를 계산했는지와 클래스 이름의 대응도 남깁니다. 정수 라벨 0과 1의 의미를 바꾸고도 이전 가중치를 그대로 쓰면 의도와 달라질 수 있습니다.</p>
<p>여러 분할로 실험한다면 각 학습 구간에서 적용한 설정을 확인합니다. 자동 계산 옵션을 썼다는 한 줄보다 계산에 참여한 자료 범위가 분명한 기록이 유용합니다.</p>
<p><a href="https://scikit-learn.org/stable/modules/generated/sklearn.utils.class_weight.compute_class_weight.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">4. 재표본화는 어떤 표본을 제공할지 바꿉니다</h2>
<p>과대표본화는 적은 클래스의 표본을 늘리는 접근이며 imbalanced-learn은 단순한 무작위 반복과 합성 표본을 만드는 방법을 구분해 설명합니다. 같은 표본을 반복하는 것과 새로운 실제 사례를 수집하는 것은 다릅니다.</p>
<p>합성 표본 역시 현실에서 새로 관측한 사례라고 해석해서는 안 됩니다. 과소표본화는 많은 쪽의 일부를 선택하는 접근으로 이해할 수 있으며 어떤 표본을 남기는지는 방법에 따라 다릅니다.</p>
<p>따라서 같은 개수로 맞췄더라도 학습에 사용한 정보가 같다고 볼 수 없습니다. 가상의 900개와 100개 자료에서 900개 쪽을 줄이면 제외된 사례가 무엇인지에 따라 결과가 달라질 수 있습니다.</p>
<p>반대로 작은 쪽을 반복해 늘리면 실제 고유 사례 수는 그대로일 수 있습니다. 원본 개수와 학습에 제공한 개수, 고유 사례 수를 나누어 적으면 이런 차이가 보입니다.</p>
<p>도구 이름만 기록하기보다 어떤 클래스에 어떤 조정을 했는지와 난수 설정을 함께 남기는 편이 좋습니다.</p>
<p><a href="https://imbalanced-learn.org/stable/over_sampling.html" rel="nofollow">관련 공식 문서</a></p>
<p><a href="https://imbalanced-learn.org/stable/under_sampling.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">5. 자료를 나눈 뒤 학습 구간에서 적용합니다</h2>
<p>전체 자료를 먼저 재표본화한 뒤 학습과 테스트로 나누면 평가에 사용할 정보가 표본 생성이나 선택 과정에 관여할 수 있습니다. imbalanced-learn 공식 안내는 이런 처리에서 데이터 누수와 평가 분포 변경이 발생할 수 있음을 설명합니다.</p>
<p>먼저 평가 역할을 나누고 재표본화는 학습 과정 안에 두는 것이 기본적인 점검 사항입니다. 교차 검증을 한다면 각 분할의 학습 구간에만 해당 처리가 적용되는지 확인합니다.</p>
<p>도구의 파이프라인에 넣었다는 사실만으로 이미 변형해 둔 전체 데이터의 문제가 사라지는 것은 아닙니다. 어떤 시점에 무엇을 적용했는지를 기록해야 합니다.</p>
<p>평가 자료의 클래스 비율을 임의로 맞춘 결과와 실제 사용 환경을 반영한 평가 결과도 구분합니다. 실험용 비교에서 균형 자료를 별도로 사용했다면 목적과 구성 조건을 명시합니다.</p>
<p>최종 성능을 좋게 보이게 하려고 평가 대상 자체를 바꾸지 않습니다. 원본 자료를 보존하고 학습용 변환 결과와 다른 파일로 관리하면 확인하기 수월합니다.</p>
<p><a href="https://imbalanced-learn.org/stable/common_pitfalls.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">6. 한 번에 하나의 조정부터 비교합니다</h2>
<p>입문 실험에서는 기준 모델, 가중치 적용 모델, 재표본화 적용 모델을 구분해 비교하는 구성이 이해하기 쉽습니다. 두 방법을 동시에 쓸 수도 있지만 어떤 효과가 어디에서 왔는지 설명하기 어려워질 수 있습니다.</p>
<p>이 제안은 모든 문제에 정해진 실험 순서를 강요하는 것이 아니라 변화의 원인을 분리해 보기 위한 방법입니다. 평가 표에는 전체 정확도 외에도 관심 클래스의 정밀도와 재현율 등 목적에 맞는 지표와 사례 수를 함께 둡니다.</p>
<p>어느 방법이 항상 우수하다고 결론 내리지 않고 자료와 모델 조건에서 확인한 결과를 적습니다. 학습 시간이나 메모리 사용이 달라졌다면 성능과 별도 항목으로 기록합니다.</p>
<p>잘못 분류된 사례를 살펴볼 때는 단순한 비율 문제인지 정답 정의와 입력 품질의 문제인지 구분할 질문을 만듭니다. 선택한 설정은 별도의 최종 평가 자료에서 확인합니다.</p>
<p>데이터의 균형을 맞췄다는 사실보다 어떤 오류가 어떻게 변했는지를 설명하는 것이 실험의 결과입니다.</p>
<hr /><h2 style="color:#1e3a5f;">7. 자주 묻는 질문</h2>
<h3>Q1. 클래스 가중치를 쓰면 소수 클래스 데이터가 늘어나나요?</h3>
<p>원본 행 수를 늘리는 기능과는 다릅니다. 해당 모델이 학습에서 클래스별 비중을 반영하는 방식이므로 실제 고유 사례 수와 구분해 기록합니다.</p>
<h3>Q2. 과대표본화는 실제 데이터를 더 수집한 것과 같나요?</h3>
<p>반복하거나 합성한 표본은 새로 관측한 실제 사례와 다릅니다. 사용한 방법과 원본·변환 후 수량을 나누어 적고 정보의 한계를 평가에서 확인해야 합니다.</p>
<h3>Q3. 테스트 자료도 절반씩 맞춰야 하나요?</h3>
<p>최종 평가 목적과 실제 사용 조건을 반영해야 하므로 자동으로 같은 비율로 맞추지 않습니다. 별도 균형 평가를 한다면 그 목적을 밝히고 원래 분포에서의 결과와 구분합니다.</p>
<h3>Q4. 가중치와 재표본화를 함께 쓰면 더 좋아지나요?</h3>
<p>항상 좋아진다고 보장할 수 없습니다. 각각의 효과를 비교하고 함께 적용한 설정도 같은 평가 자료에서 검증해 어떤 오류가 달라졌는지 확인합니다.</p>
<hr /><h2 style="color:#1e3a5f;">참고 자료</h2><ul><li><a href="https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html" rel="nofollow">scikit-learn LogisticRegression</a></li><li><a href="https://scikit-learn.org/stable/modules/generated/sklearn.utils.class_weight.compute_class_weight.html" rel="nofollow">scikit-learn 클래스 가중치 계산</a></li><li><a href="https://imbalanced-learn.org/stable/over_sampling.html" rel="nofollow">imbalanced-learn 과대표본화</a></li><li><a href="https://imbalanced-learn.org/stable/under_sampling.html" rel="nofollow">imbalanced-learn 과소표본화</a></li><li><a href="https://imbalanced-learn.org/stable/common_pitfalls.html" rel="nofollow">imbalanced-learn 데이터 누수 주의</a></li></ul>]]></description>
<dc:creator>관리자</dc:creator>
<dc:date>2026-10-09T07:13:15+09:00</dc:date>
</item>


<item>
<title>조기 종료 Early Stopping, 학습을 멈추는 기준과 모델 선택 이해하기</title>
<link>https://nusu.devtechinfo.xyz/blog/%EC%A1%B0%EA%B8%B0-%EC%A2%85%EB%A3%8C-early-stopping-%ED%95%99%EC%8A%B5%EC%9D%84-%EB%A9%88%EC%B6%94%EB%8A%94-%EA%B8%B0%EC%A4%80%EA%B3%BC-%EB%AA%A8%EB%8D%B8/</link>
<description><![CDATA[<p>모델 학습을 오래 실행한다고 새 데이터에서의 성능이 계속 좋아지는 것은 아닙니다. 조기 종료는 미리 정한 관찰 지표가 충분히 개선되지 않을 때 학습을 멈추는 규칙입니다.</p>
<p>여기서 중요한 것은 몇 번 반복했는지뿐 아니라 무엇을 보고 멈췄고 어느 시점의 모델을 남겼는지입니다. 학습 중단, 좋은 가중치 선택, 파일 저장을 나누어 이해하면 실험 결과를 더 정확하게 설명할 수 있습니다.</p>
<p style="margin:24px 0 8px;"><img src="https://devtechinfo.xyz/data/editor/2610/ai-34a70cc1169c43e7bb72.png" alt="학습 지표를 상징하는 곡선이 표시된 노트북" width="1200" height="1024" style="height:auto;" /></p>
<p style="font-size:14px;color:#64748b;margin:0 0 24px;">AI 생성 삽화 · 개념 이해를 위한 AI 연출 이미지이며 실제 시스템 구성도나 측정 결과가 아닙니다.</p>
<blockquote style="border-left:4px solid #1e3a5f;background:#f1f5f9;padding:16px 20px;margin:24px 0;"><p><strong>핵심 정리</strong><br />관찰 지표와 개선 방향, 기다릴 횟수를 먼저 정합니다. 학습이 멈춘 시점과 선택된 가중치의 시점은 다를 수 있으며 최종 평가는 별도 자료로 확인합니다.</p></blockquote>
<hr /><h2 style="color:#1e3a5f;">1. 학습 손실과 검증 결과는 역할이 다릅니다</h2>
<p>학습 자료를 이용해 모델의 값을 갱신하는 과정과, 별도로 준비한 검증 자료에서 결과를 확인하는 과정은 구분됩니다. Keras의 기본 학습 인터페이스는 검증 자료를 제공해 학습 중 검증 지표를 기록하는 방식을 지원합니다.</p>
<p>조기 종료를 검증 손실에 연결했다면 그 값이 실제로 기록되는지 먼저 확인해야 합니다. 화면에 숫자가 많이 출력된다는 이유로 원하는 지표가 모두 존재하는 것은 아닙니다.</p>
<p>실험 메모에는 학습과 검증에 어떤 자료를 썼는지 적습니다. 가상의 분류 실험에서 학습 손실은 내려가는데 검증 손실은 오르기 시작했다면 두 곡선이 다른 질문에 답하고 있음을 볼 수 있습니다.</p>
<p>다만 한 번의 변화만으로 원인을 과적합 하나로 확정하지는 않습니다. 자료 구성과 지표 계산 조건, 실험의 변동성도 함께 살펴야 합니다.</p>
<p>조기 종료는 이런 관찰을 바탕으로 실행을 멈추는 규칙이지 문제의 원인을 자동 진단하는 도구는 아닙니다.</p>
<p><a href="https://keras.io/guides/training_with_built_in_methods/" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">2. 개선의 의미와 기다릴 횟수를 설정합니다</h2>
<p>Keras EarlyStopping에서는 monitor로 관찰 지표를 고르고 mode로 개선 방향을 정합니다. 손실처럼 낮을수록 좋은 지표와 정확도처럼 높을수록 좋은 지표는 방향이 다릅니다.</p>
<p>min_delta는 개선으로 인정할 변화량, patience는 개선 없이 기다릴 에포크 수와 관련됩니다. 필요한 지표가 로그에 존재하는지와 설정 이름을 실제 문서에서 확인해야 합니다.</p>
<p>숫자를 복사해 적용하기 전에 왜 그 기준을 선택했는지 적어 보는 편이 좋습니다. 예를 들어 매번 아주 작은 변동이 나타나는 실험과 변화 폭이 큰 실험에 같은 기준을 넣으면 기대한 중단 시점과 다를 수 있습니다.</p>
<p>기다리는 횟수를 늘렸다는 사실만으로 결과가 더 신뢰할 만해지는 것도 아닙니다. 학습 시간과 놓치고 싶지 않은 개선의 범위를 함께 검토합니다.</p>
<p>기본값은 라이브러리와 버전에 따라 확인할 사항이며 이 글의 설명을 모든 도구의 공통 설정값으로 사용하지 않습니다. 실험 결과에는 실제 적용한 값을 남겨 다른 실행과 비교할 수 있게 합니다.</p>
<p><a href="https://keras.io/api/callbacks/early_stopping/" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">3. 가상의 손실 기록으로 중단 이유를 설명합니다</h2>
<p>검증 손실이 에포크마다 0.62, 0.55, 0.51, 0.52, 0.53으로 기록됐다고 가정합니다. 이는 이해를 위한 숫자이며 실제 모델의 결과가 아닙니다.</p>
<p>낮은 값이 좋은 지표라면 이 기록에서 가장 작은 값은 세 번째의 0.51입니다. 이후 두 번의 값은 그보다 낮지 않습니다.</p>
<p>개선 없이 두 차례 기다리는 규칙을 적용하는 예에서는 마지막 시점에서 중단을 검토할 수 있습니다. 실제 실행의 경계 조건은 사용한 도구의 구현과 시작 시점 설정을 확인해야 합니다.</p>
<p>이 기록에서 마지막 손실은 0.53이지만 가장 좋았던 관찰 값은 0.51이라는 점이 핵심입니다. 종료 로그에 마지막 값만 적으면 어느 시점의 모델을 선택했는지 알기 어렵습니다.</p>
<p>보고서에는 중단 에포크와 최선 지표의 에포크를 따로 기록하는 편이 좋습니다. 지표가 동률일 때나 기준 변화량보다 작게 좋아졌을 때의 처리도 시험 자료로 확인하면 설정을 설명하기 쉬워집니다.</p>
<hr /><h2 style="color:#1e3a5f;">4. 중단과 가중치 복원, 파일 저장을 구분합니다</h2>
<p>학습을 멈췄다고 자동으로 가장 좋은 시점의 가중치가 선택됐다고 생각하면 안 됩니다. Keras EarlyStopping의 restore_best_weights는 관찰 지표가 좋았던 시점의 가중치 복원과 관련된 설정이므로 실제 값을 확인해야 합니다.</p>
<p>메모리 안의 모델 상태가 바뀌는 일과 디스크에 파일을 남기는 일도 별개입니다. ModelCheckpoint는 학습 중 모델이나 가중치를 저장하는 콜백이며 저장 조건과 경로를 정할 수 있습니다.</p>
<p>두 기능을 함께 쓴다면 같은 지표와 같은 개선 방향을 보고 있는지 확인합니다. 가상의 실험에서 중단은 검증 손실을 기준으로 하고 저장은 다른 지표를 기준으로 했다면 선택된 파일의 시점이 달라질 수 있습니다.</p>
<p>어느 쪽이 맞는지 이름만 보고 결정하지 말고 실험 목적과 설정을 비교합니다. 파일명에 실행 식별자와 저장 기준을 남기고 최종 평가에 사용한 파일을 기록하면 혼동을 줄일 수 있습니다.</p>
<p>파일이 있다는 사실만으로 원하는 상태가 저장됐다는 확인을 대신하지 않습니다.</p>
<p><a href="https://keras.io/api/callbacks/early_stopping/" rel="nofollow">관련 공식 문서</a></p>
<p><a href="https://keras.io/api/callbacks/model_checkpoint/" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">5. 검증 자료로 선택했다면 테스트는 남겨 둡니다</h2>
<p>조기 종료를 결정하는 데 검증 자료를 사용했다면 그 자료는 모델 선택 과정에 참여한 것입니다. 이후 여러 설정을 비교하면서 같은 자료에서 좋은 결과를 고르는 작업도 선택에 포함됩니다.</p>
<p>최종 성능을 확인할 자료의 역할은 따로 남겨 두어야 합니다. scikit-learn의 교차 검증 안내 역시 학습 설정을 정하는 자료와 최종 평가 자료를 구분하는 이유를 설명합니다.</p>
<p>시간 순서나 동일한 대상의 반복 관찰이 중요한 문제라면 자료를 나누는 방식도 그 조건에 맞춰 검토합니다. 테스트 결과를 보고 patience를 계속 바꾸면서 마지막 수치를 독립적인 평가라고 부르는 것은 적절하지 않습니다.</p>
<p>실습 보고서에는 각 자료가 학습, 선택, 최종 확인 중 어디에 쓰였는지 적습니다. 성능 숫자만 보고할 때보다 어떤 비교를 했는지가 분명해집니다.</p>
<p>자료가 적어 역할 분리가 어렵다면 그 한계를 숨기지 말고 평가 설계와 결과 해석의 제한으로 설명합니다. 중단 규칙이 데이터 분리 문제까지 해결해 주지는 않습니다.</p>
<p><a href="https://scikit-learn.org/stable/modules/cross_validation.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">6. 학습 시간을 줄인 이유와 성능은 따로 보고합니다</h2>
<p>조기 종료는 신경망에만 등장하는 아이디어가 아닙니다. scikit-learn은 그래디언트 부스팅에서 검증 결과를 이용해 추가 학습을 멈추는 예시를 제공합니다.</p>
<p>다만 반복 단위와 설정의 뜻은 모델별로 다르므로 한 도구의 에포크 수를 다른 도구의 단계 수와 그대로 비교하지 않습니다. 자신의 실험에서는 계획한 최대 반복 수와 실제 중단 지점, 사용한 시간, 선택한 모델의 평가 결과를 함께 적습니다.</p>
<p>빨리 끝났다는 사실과 성능이 충분하다는 판단은 별도입니다. 설정 오류로 지나치게 일찍 끝난 실행도 있을 수 있으므로 관찰 지표의 기록을 확인합니다.</p>
<p>반대로 최대 반복 수까지 실행됐다면 이번 조건에서는 중단 기준이 충족되지 않았다는 뜻인지 살펴봅니다. 실험을 다시 수행할 때 비교할 수 있도록 자료 범위와 난수 설정, 라이브러리 버전도 보관합니다.</p>
<p>목표는 항상 가장 짧게 학습하는 것이 아니라 멈춘 이유와 남긴 모델을 설명할 수 있는 실험을 만드는 것입니다.</p>
<p><a href="https://scikit-learn.org/stable/auto_examples/ensemble/plot_gradient_boosting_early_stopping.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">7. 자주 묻는 질문</h2>
<h3>Q1. 조기 종료는 과적합을 완전히 막아 주나요?</h3>
<p>그렇게 보장하는 기능은 아닙니다. 정한 지표와 자료에서 개선 여부를 보고 중단하므로 데이터 분리와 모델 설정, 최종 평가를 함께 확인해야 합니다.</p>
<h3>Q2. patience를 크게 하면 무조건 좋은가요?</h3>
<p>더 오래 기다리는 설정이 항상 성능 개선으로 이어지는 것은 아닙니다. 지표의 변동과 학습 시간, 실험 목적을 보고 선택하고 실제 중단 기록을 함께 비교합니다.</p>
<h3>Q3. 멈춘 모델이 가장 좋았던 모델과 같은가요?</h3>
<p>가중치 복원과 저장 설정에 따라 다를 수 있습니다. 중단 시점과 최선 지표의 시점, 평가에 사용한 파일을 각각 기록해 어떤 모델을 선택했는지 확인합니다.</p>
<h3>Q4. 검증 손실이 기록되지 않는데 그 이름으로 설정해도 되나요?</h3>
<p>관찰하려는 지표가 실제 학습 로그에 제공되는지 먼저 확인해야 합니다. 검증 자료와 지표 설정을 점검하고 출력된 이름을 확인한 뒤 중단 기준을 연결합니다.</p>
<hr /><h2 style="color:#1e3a5f;">참고 자료</h2><ul><li><a href="https://keras.io/api/callbacks/early_stopping/" rel="nofollow">Keras EarlyStopping</a></li><li><a href="https://keras.io/guides/training_with_built_in_methods/" rel="nofollow">Keras 학습과 평가 안내</a></li><li><a href="https://keras.io/api/callbacks/model_checkpoint/" rel="nofollow">Keras ModelCheckpoint</a></li><li><a href="https://scikit-learn.org/stable/modules/cross_validation.html" rel="nofollow">scikit-learn 교차 검증</a></li><li><a href="https://scikit-learn.org/stable/auto_examples/ensemble/plot_gradient_boosting_early_stopping.html" rel="nofollow">scikit-learn 부스팅 조기 종료 예시</a></li></ul>]]></description>
<dc:creator>관리자</dc:creator>
<dc:date>2026-10-07T07:19:35+09:00</dc:date>
</item>


<item>
<title>분류 모델의 확률 보정, 높은 점수와 믿을 만한 확률의 차이</title>
<link>https://nusu.devtechinfo.xyz/blog/%EB%B6%84%EB%A5%98-%EB%AA%A8%EB%8D%B8%EC%9D%98-%ED%99%95%EB%A5%A0-%EB%B3%B4%EC%A0%95-%EB%86%92%EC%9D%80-%EC%A0%90%EC%88%98%EC%99%80-%EB%AF%BF%EC%9D%84-%EB%A7%8C%ED%95%9C/</link>
<description><![CDATA[<p>분류 모델이 어떤 입력에 0.9를 출력했다고 해서 그 예측이 실제로 90%의 비율로 맞는다고 곧바로 해석할 수는 없습니다. 점수가 큰 대상을 잘 고르는 능력과 확률값이 관측 비율에 맞는 성질은 구분해서 살펴봐야 합니다.</p>
<p>확률 보정은 이 가운데 숫자로 표현된 확신의 수준을 점검하고 조정하는 문제입니다. 이 글에서는 이진 분류를 기준으로 보정의 의미와 평가 방법을 정리합니다.</p>
<p style="margin:24px 0 8px;"><img src="https://devtechinfo.xyz/data/editor/2610/ai-994431c3dfd48d416885.png" alt="확률 평가를 상징하는 점 그래프가 있는 노트북과 작업 책상" width="1200" height="1024" style="height:auto;" /></p>
<p style="font-size:14px;color:#64748b;margin:0 0 24px;">AI 생성 삽화 · 개념 이해를 위한 AI 연출 이미지이며 실제 시스템 구성도나 측정 결과가 아닙니다.</p>
<blockquote style="border-left:4px solid #1e3a5f;background:#f1f5f9;padding:16px 20px;margin:24px 0;"><p><strong>핵심 정리</strong><br />확률 보정은 예측 확률과 실제 관측 비율의 대응을 다룹니다. 분류 경계, 순위 평가, 확률 평가를 나누고 보정에 사용하지 않은 자료로 결과를 확인해야 합니다.</p></blockquote>
<hr /><h2 style="color:#1e3a5f;">1. 개별 정답이 아니라 비슷한 확률의 집단을 봅니다</h2>
<p>모델이 양성일 확률을 0.7 정도로 예측한 사례를 여러 개 모았다고 생각해 봅니다. 그 집단에서 실제 양성이 대략 70%라면 해당 구간의 예측과 관측이 비슷하다고 볼 수 있습니다.</p>
<p>하나의 입력이 양성이었다는 사실만으로 0.7이라는 확률을 맞았다고 채점하는 방식과는 다릅니다. 다음은 이해를 위한 가상 예시입니다.</p>
<p>알림 대상 후보 100개에 모두 0.7 안팎의 확률을 주었는데 실제 대상이 40개였다면, 그 자료에서는 모델이 집단의 양성 비율보다 높은 확률을 제시한 셈입니다. 이 숫자는 실제 서비스 측정 결과가 아닙니다.</p>
<p>또한 한 구간의 관찰만으로 모델 전체를 평가할 수도 없습니다. 0.2 주변이나 0.9 주변에서는 다른 모습이 나올 수 있으므로 여러 구간을 함께 봅니다.</p>
<p>어떤 사건을 양성으로 정의했는지와 정답을 언제 확정했는지도 중요합니다. 아직 결과가 나오지 않은 사례를 음성으로 채우면 비교할 기준 자체가 바뀝니다.</p>
<p><a href="https://scikit-learn.org/stable/modules/calibration.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">2. 보정 곡선은 구간의 평균과 관측 비율을 연결합니다</h2>
<p>보정 곡선을 만들 때는 예측값을 구간에 모으고 각 구간의 평균 예측 확률과 실제 양성 비율을 비교합니다. 가로축과 세로축의 값이 비슷할수록 해당 구간에서 두 값이 잘 대응한다는 의미입니다.</p>
<p>scikit-learn의 calibration_curve는 이진 분류 확률을 구간으로 나누는 도구이며, 구간 폭을 같게 하거나 표본 수를 비슷하게 나누는 방식을 제공합니다. 구간에 자료가 없다면 결과 점이 만들어지지 않을 수 있습니다.</p>
<p>그래프를 볼 때 선의 모양만 보지 말고 구간별 사례 수도 같이 기록하는 편이 좋습니다. 가상으로 두 사례 중 하나가 양성이었던 구간과 200개 중 100개가 양성이었던 구간은 모두 비율이 0.5입니다.</p>
<p>그러나 두 관찰이 제공하는 정보의 양은 같지 않습니다. 구간을 지나치게 잘게 나눈 그림을 정교한 평가라고 생각하지 않는 이유입니다.</p>
<p>다른 실험의 그림을 비교할 때는 구간 기준과 평가 데이터가 같은지도 먼저 맞춥니다.</p>
<p><a href="https://scikit-learn.org/stable/modules/generated/sklearn.calibration.calibration_curve.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">3. 보정기는 모델 출력과 확률 사이의 변환을 배웁니다</h2>
<p>일반적인 보정 과정에서는 분류 모델이 낸 점수를 입력으로 받아 보정된 확률을 만드는 변환을 학습합니다. 원래 입력 특성을 다시 설계하는 일과는 역할이 다릅니다.</p>
<p>이미 학습된 모델을 보정할 때는 그 모델 학습에 사용한 자료와 보정에 쓰는 자료를 구분해야 합니다. scikit-learn의 CalibratedClassifierCV는 교차 검증을 이용하는 구성을 제공하며, 이미 학습한 모델을 다루는 경우에도 데이터 분리는 사용자가 확인할 사항입니다.</p>
<p>도구를 호출했다는 사실만으로 자신이 준비한 데이터의 누수가 사라지는 것은 아닙니다. 실험 메모에는 기본 모델을 학습한 자료, 보정 변환을 학습한 자료, 최종 비교에 남겨 둔 자료를 각각 적는 것이 좋습니다.</p>
<p>같은 이용자의 기록이나 시간 순서가 중요한 문제라면 행 번호를 무작위로 나누는 것만으로 독립적인 평가가 된다고 가정하지 않습니다. 보정 방법과 분할 구성을 바꿨다면 결과표에서도 다른 실험으로 구분합니다.</p>
<p><a href="https://scikit-learn.org/stable/modules/generated/sklearn.calibration.CalibratedClassifierCV.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">4. 분류 임계값을 바꾸는 일과 목적이 다릅니다</h2>
<p>확률 보정은 출력 숫자의 의미를 조정하고, 임계값은 그 숫자를 바탕으로 어떤 행동이나 라벨을 선택할지 정합니다. 예를 들어 0.6을 넘으면 검토 대상으로 보낸다는 규칙은 결정 기준입니다.</p>
<p>보정 후 같은 입력의 확률이 0.65에서 0.48로 바뀌었다면 같은 기준을 적용해도 선택 결과가 달라질 수 있습니다. 반대로 확률값을 그대로 둔 채 기준만 0.6에서 0.4로 낮추는 것은 확률 보정이 아닙니다.</p>
<p>이 숫자들은 두 작업을 구분하기 위한 가상 예시이며 추천 설정이 아닙니다. 실험에서 보정과 기준 변경을 동시에 수행했다면 성능 변화가 어느 작업에서 왔는지 따로 비교해야 합니다.</p>
<p>모델 확률을 화면에 보여 주는 용도와 자동 알림을 보낼 대상을 정하는 용도도 요구가 다를 수 있습니다. 따라서 결과표에 확률 평가와 최종 행동의 평가를 나누어 적으면 설명이 명확해집니다.</p>
<p>기준 선택에도 평가 자료를 반복 사용하면 결과가 낙관적으로 보일 수 있으므로 실험 목적과 자료의 역할을 먼저 정합니다.</p>
<p><a href="https://scikit-learn.org/stable/modules/classification_threshold.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">5. 확률 오차 지표 하나만으로 결론 내리지 않습니다</h2>
<p>이진 분류의 Brier 점수는 각 예측 확률과 0 또는 1로 표시한 실제 결과의 차이를 제곱해 평균하는 방식으로 이해할 수 있습니다. 실제 양성이 1인 한 사례에 0.8을 예측했다면 제곱 오차는 0.04이고, 0.6을 예측했다면 0.16입니다.</p>
<p>이는 계산을 설명하기 위한 예이며 두 사례만으로 모델을 고르라는 뜻은 아닙니다. 실제 비교에서는 동일한 평가 집합 전체를 사용합니다.</p>
<p>Brier 손실이 낮아졌다고 보정 상태만 좋아졌다고 단정해서는 안 됩니다. 공식 가이드는 이 지표가 확률 보정 외의 분별 능력과 자료의 특성도 함께 반영한다고 설명합니다.</p>
<p>보정 곡선과 사례 수, 업무에 필요한 분류 지표를 함께 검토해야 하는 이유입니다. 지표를 계산할 때는 양성 클래스가 무엇인지, 다중 분류와 이진 분류의 설정이 같은지 확인합니다.</p>
<p>서로 다른 정의로 계산한 수치를 한 줄에 놓으면 개선 여부를 잘못 해석하기 쉽습니다.</p>
<p><a href="https://scikit-learn.org/stable/modules/generated/sklearn.metrics.brier_score_loss.html" rel="nofollow">관련 공식 문서</a></p>
<p><a href="https://scikit-learn.org/stable/modules/calibration.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">6. 작은 실험 기록으로 재현 가능한 비교를 만듭니다</h2>
<p>처음 실습할 때는 보정 전후 확률을 같은 평가 행에 나란히 저장하는 방식이 유용합니다. 정답, 평가 구간, 모델 식별자, 보정 방법을 함께 기록하면 어떤 숫자를 비교했는지 되짚을 수 있습니다.</p>
<p>결과를 보고 좋았던 사례만 뽑지 말고 미리 정한 평가 집합을 유지합니다. 실패한 예측을 살펴볼 때도 확률이 높았다는 이유만으로 같은 원인이라고 묶지 않습니다.</p>
<p>입력의 범위와 정답 정의, 자료 수집 시점을 같이 확인합니다. 실험 보고서에는 이번 자료에서 어느 구간의 대응이 달라졌는지와 무엇을 확인하지 못했는지를 적습니다.</p>
<p>서비스 대상이나 기간이 달라졌을 때도 보정이 그대로 유지된다고 보장할 수는 없습니다. 새로운 자료가 쌓이면 같은 평가 절차로 비교할 수 있도록 설정과 자료 범위를 남겨 둡니다.</p>
<p>입문 단계의 목표는 특정 보정 방법을 항상 적용하는 습관이 아니라 출력 확률을 어떤 근거로 읽을지 설명할 수 있게 되는 것입니다.</p>
<hr /><h2 style="color:#1e3a5f;">7. 자주 묻는 질문</h2>
<h3>Q1. 정확도가 높으면 확률 보정은 필요 없나요?</h3>
<p>정확도와 확률의 관측 비율 일치는 서로 다른 질문입니다. 확률값 자체를 의사결정이나 설명에 사용한다면 정확도만 보지 말고 보정 곡선과 확률 평가도 확인하는 편이 좋습니다.</p>
<h3>Q2. 보정하면 모든 입력의 정답 확률을 알 수 있나요?</h3>
<p>개별 입력의 결과를 보장하는 기능은 아닙니다. 평가 자료에서 비슷한 확률을 받은 집단의 관측 비율과 대응을 살피는 것이며, 자료가 달라지면 그 대응도 다시 확인해야 합니다.</p>
<h3>Q3. 보정 데이터를 최종 테스트에도 써도 되나요?</h3>
<p>보정 과정에서 이미 이용한 자료만으로 최종 효과를 판단하면 독립적인 확인이 어렵습니다. 모델 학습과 보정, 최종 평가에 쓴 자료의 역할을 구분하고 남겨 둔 평가 집합으로 비교합니다.</p>
<h3>Q4. 처음부터 가장 복잡한 보정 방법을 고르면 되나요?</h3>
<p>복잡한 방법이 항상 더 적합한 것은 아니며 데이터 규모와 분포에 따라 결과가 달라집니다. 사용한 방법과 분할 조건을 기록하고 동일한 평가 자료에서 보정 전후를 비교해 선택 근거를 남깁니다.</p>
<hr /><h2 style="color:#1e3a5f;">참고 자료</h2><ul><li><a href="https://scikit-learn.org/stable/modules/calibration.html" rel="nofollow">scikit-learn 확률 보정 개념</a></li><li><a href="https://scikit-learn.org/stable/modules/generated/sklearn.calibration.calibration_curve.html" rel="nofollow">scikit-learn calibration_curve</a></li><li><a href="https://scikit-learn.org/stable/modules/generated/sklearn.calibration.CalibratedClassifierCV.html" rel="nofollow">scikit-learn CalibratedClassifierCV</a></li><li><a href="https://scikit-learn.org/stable/modules/classification_threshold.html" rel="nofollow">scikit-learn 분류 임계값</a></li><li><a href="https://scikit-learn.org/stable/modules/generated/sklearn.metrics.brier_score_loss.html" rel="nofollow">scikit-learn Brier 손실</a></li></ul>]]></description>
<dc:creator>관리자</dc:creator>
<dc:date>2026-10-06T07:19:13+09:00</dc:date>
</item>


<item>
<title>K겹 교차 검증, 모델을 여러 번 평가하는 이유와 분할의 기준</title>
<link>https://nusu.devtechinfo.xyz/blog/k%EA%B2%B9-%EA%B5%90%EC%B0%A8-%EA%B2%80%EC%A6%9D-%EB%AA%A8%EB%8D%B8%EC%9D%84-%EC%97%AC%EB%9F%AC-%EB%B2%88-%ED%8F%89%EA%B0%80%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0%EC%99%80/</link>
<description><![CDATA[<p>머신러닝 모델을 한 번 나눈 데이터로만 평가하면 그 분할에서 얻은 점수가 얼마나 안정적인지 알기 어렵습니다. K겹 교차 검증은 학습에 사용할 자료를 여러 묶음으로 나누고, 평가에 쓰는 묶음을 바꾸면서 학습과 검증을 반복하는 방법입니다.</p>
<p>다만 여러 번 평가했다는 사실만으로 좋은 평가 설계가 완성되지는 않습니다. 같은 사람의 기록이나 시간 순서가 섞이면 여전히 문제가 생길 수 있습니다.</p>
<p>이 글의 수량과 점수는 개념 설명용 예시이며 실제 모델의 성능을 나타내지 않습니다.</p>
<p style="margin:24px 0 8px;"><img src="https://devtechinfo.xyz/data/editor/2610/ai-c499956ae609a12e2efb.png" alt="K겹 교차 검증, 모델을 여러 번 평가하는 이유와 분할의 기준 관련 설명용 삽화" width="1200" height="1024" style="height:auto;" /></p>
<p style="font-size:14px;color:#64748b;margin:0 0 24px;">AI 생성 삽화 · 개념 이해를 위한 AI 연출 이미지이며 실제 시스템 구성도나 측정 결과가 아닙니다.</p>
<blockquote style="border-left:4px solid #1e3a5f;background:#f1f5f9;padding:16px 20px;margin:24px 0;"><p><strong>핵심 정리</strong><br />교차 검증은 여러 분할에서 학습 절차를 평가하는 방법입니다. 전처리도 각 학습 구간에서 학습하고, 데이터의 그룹·시간 관계에 맞는 분할을 선택한 뒤 최종 모델과 평가 기록을 구분합니다.</p></blockquote>
<hr /><h2 style="color:#1e3a5f;">1. 평가할 묶음을 바꾸며 새로 학습합니다</h2>
<p>설명용으로 12개 표본을 A, B, C의 세 묶음으로 나누고 각 묶음에 4개씩 있다고 가정합니다. 첫 회에는 B와 C의 8개로 학습하고 A의 4개로 평가합니다.</p>
<p>다음에는 A와 C로 새로 학습해 B를 평가하고, 마지막에는 A와 B로 학습해 C를 평가합니다. 이렇게 각 묶음이 한 번씩 평가 역할을 맡는 흐름이 기본적인 K겹 교차 검증의 예입니다.</p>
<p>이전 회차의 모델을 그대로 이어 학습하는 과정과 구분해야 합니다. 평가 대상이 이미 학습에 들어간 모델을 가져오면 해당 회차의 검증 의미가 달라집니다.</p>
<p>scikit-learn의 공식 설명도 K-1개 묶음으로 학습한 모델을 남은 묶음에서 평가하는 절차를 정리합니다. 반복 횟수를 늘리는 것과 신경망을 여러 에포크 학습하는 것도 다른 개념입니다.</p>
<p>교차 검증은 평가에 참여하는 데이터의 역할을 바꾸는 절차이며 한 모델의 학습 반복 수를 말하는 것이 아닙니다.</p>
<p><a href="https://scikit-learn.org/stable/modules/cross_validation.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">2. 여러 점수를 함께 보고 한 숫자로 과장하지 않습니다</h2>
<p>가상의 세 회차 점수가 0.7, 0.8, 0.9라면 단순 평균은 0.8입니다. 이 숫자는 선택한 분할과 지표에서 얻은 결과를 요약할 뿐 실제 서비스에서도 항상 같은 점수가 나온다는 보장이 아닙니다.</p>
<p>평균만 같아도 회차별 결과가 고른 경우와 차이가 큰 경우는 다르게 살펴볼 수 있습니다. 낮은 회차에 어떤 데이터가 들어갔는지 확인하면 표본 구성의 영향을 이해하는 데 도움이 됩니다.</p>
<p>다만 가장 잘 나온 회차만 보고 성능을 보고하거나 낮은 회차를 이유 없이 제외하면 비교 기준이 흐려집니다. 지표 이름과 계산 방식, 회차별 표본 수를 함께 남기는 편이 좋습니다.</p>
<p>표준편차를 적더라도 그것을 자동으로 신뢰구간이나 미래 성능의 보장 범위로 해석하지 않습니다. 평가의 목적은 유리한 숫자를 고르는 것이 아니라 같은 학습 절차가 분할 조건에서 어떤 결과를 보이는지 확인하는 데 있습니다.</p>
<p>다른 방법과 비교할 때도 가능한 한 같은 분할과 지표를 사용합니다.</p>
<hr /><h2 style="color:#1e3a5f;">3. 전처리도 회차별 학습 데이터에서 구합니다</h2>
<p>표준화나 특성 선택처럼 데이터로부터 정보를 얻는 전처리를 전체 자료에 먼저 적용하면 평가 구간의 정보가 학습 과정에 들어갈 수 있습니다. scikit-learn의 공통 실수 안내는 전처리 학습과 평가 자료를 분리하고 파이프라인을 활용하는 방식을 설명합니다.</p>
<p>설명용으로 각 특성을 학습 평균으로 바꾸는 처리를 생각해 봅니다. 평가 묶음까지 포함해 평균을 구했다면 모델 자체는 그 행을 보지 않았어도 전처리에는 정보가 반영된 것입니다.</p>
<p>각 회차의 학습 구간으로 전처리를 학습하고 해당 변환을 평가 구간에 적용해야 합니다. 전처리가 정답을 직접 사용하지 않는다는 이유만으로 항상 누수와 무관하다고 생각하지 않습니다.</p>
<p>파이프라인을 쓰더라도 그 앞에서 이미 전체 데이터로 학습한 변환을 넣었다면 의도한 분리가 깨질 수 있습니다. 실험 기록에는 모델 설정뿐 아니라 전처리가 어느 데이터로 학습됐는지도 남깁니다.</p>
<p>이 구분은 점수가 지나치게 좋게 나온 원인을 조사할 때도 유용합니다.</p>
<p><a href="https://scikit-learn.org/stable/common_pitfalls.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">4. 같은 대상의 기록은 그룹 관계를 고려합니다</h2>
<p>한 사람이나 하나의 장비에서 나온 기록이 여러 행에 들어 있을 수 있습니다. 새로운 대상에 대한 성능을 알고 싶은데 같은 대상의 기록이 학습과 평가 양쪽에 나뉘면 목적과 다른 평가가 될 수 있습니다.</p>
<p>GroupKFold는 그룹이 겹치지 않게 분할하는 도구입니다. 어떤 열을 그룹으로 볼지는 업무에서 실제로 구분해야 하는 대상에 맞춰 결정합니다.</p>
<p>가상의 고객 행동 자료를 예로 들면 고객 번호와 행 번호는 서로 다른 단위입니다. 단순히 행을 섞었다는 사실만으로 고객 간 분리가 이뤄진 것은 아닙니다.</p>
<p>반대로 기존 고객의 미래 행동을 예측하는 문제라면 시간 관계까지 함께 고려해야 할 수 있습니다. 그룹 분할은 모든 문제의 만능 해법이 아니라 평가 질문에 맞춰 선택하는 방식입니다.</p>
<p>그룹 수와 각 그룹의 규모가 분할에 어떤 영향을 주는지도 살펴봅니다. 보고서에는 어떤 관계가 학습과 평가 사이에 겹치지 않도록 했는지 명시하면 결과의 적용 범위를 이해하기 쉽습니다.</p>
<p><a href="https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GroupKFold.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">5. 시간 순서가 중요한 문제는 별도로 설계합니다</h2>
<p>미래를 예측하려는 문제에서 미래의 자료로 학습하고 과거를 평가하면 실제 사용 상황을 재현하지 못할 수 있습니다. scikit-learn의 TimeSeriesSplit은 시간 순서가 있는 자료를 위한 분할을 제공합니다.</p>
<p>다만 도구 이름만 선택하면 데이터 준비의 모든 문제가 해결되는 것은 아닙니다. 각 행의 특성이 언제 알 수 있었던 정보인지도 확인해야 합니다.</p>
<p>예를 들어 과거 날짜의 행에 현재까지 합산한 값을 붙였다면 행 순서를 보존해도 정보의 시점은 맞지 않을 수 있습니다. 평가 기간과 예측 시점, 사용할 수 있는 데이터 범위를 먼저 정합니다.</p>
<p>일정한 시간 간격 같은 도구의 전제와 자신의 자료가 맞는지도 공식 안내를 확인합니다. 일반 KFold를 쓸 때도 기본 섞기 여부를 추측하지 말고 실제 설정을 확인해야 합니다.</p>
<p>재현에 필요한 분할 설정과 데이터 버전을 남기면 다음 실험에서 같은 평가 조건을 유지하기 쉽습니다. 중요한 것은 익숙한 도구보다 실제 예측 상황에 맞는 경계입니다.</p>
<p><a href="https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.TimeSeriesSplit.html" rel="nofollow">관련 공식 문서</a></p>
<p><a href="https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.KFold.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">6. 평가를 마친 뒤 최종 모델을 별도로 만듭니다</h2>
<p>교차 검증에서 얻은 여러 모델을 그대로 모두 배포해야 하는 것은 아닙니다. 평가와 설정 선택이 끝나면 정한 학습 절차로 최종 모델을 학습하는 단계를 구분할 수 있습니다.</p>
<p>여러 모델을 결합하는 앙상블을 택한다면 그것은 별도의 설계와 검증이 필요한 결정입니다. 가장 점수가 높았던 한 회차의 모델을 고르는 것 역시 자동으로 올바른 최종 선택이 되지는 않습니다.</p>
<p>검증 결과를 반복해서 보며 설정을 고쳤다면 그 과정과 최종 성능 평가의 구분이 필요합니다. 처음부터 남겨 둔 최종 평가 자료를 튜닝에 계속 사용하는 일을 피합니다.</p>
<p>실험 기록에는 분할 방식, 지표, 회차별 결과, 선택한 설정, 최종 학습 자료의 범위를 남길 수 있습니다. 계산 비용도 함께 기록하면 K를 늘리는 선택이 실제로 필요한지 검토하기 쉽습니다.</p>
<p>교차 검증 결과는 모델 파일 하나의 성능표라기보다 특정 조건에서 학습 절차를 평가한 근거로 이해하는 것이 정확합니다.</p>
<p><a href="https://scikit-learn.org/stable/modules/cross_validation.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">7. 자주 묻는 질문</h2>
<h3>Q1. K겹 교차 검증은 한 모델을 K번 이어 학습하나요?</h3>
<p>일반적인 교차 검증에서는 각 분할의 학습 구간으로 모델을 새로 학습해 평가합니다. 이전 회차에서 평가 자료를 본 모델을 그대로 이어 쓰는 것과 구분합니다.</p>
<h3>Q2. 평균 점수만 보고 모델을 비교해도 되나요?</h3>
<p>회차별 결과와 평가 조건을 함께 봐야 합니다. 같은 평균이라도 분할별 차이와 표본 구성이 다를 수 있습니다.</p>
<h3>Q3. 표준화는 교차 검증 전에 한 번만 하면 되나요?</h3>
<p>데이터로부터 학습하는 전처리는 각 학습 구간에서 구해야 합니다. 전체 자료로 먼저 학습한 변환은 평가 정보가 섞일 수 있습니다.</p>
<h3>Q4. 검증 후 여러 모델을 모두 배포해야 하나요?</h3>
<p>그럴 필요가 항상 있는 것은 아닙니다. 최종 학습 절차와 앙상블 사용 여부는 평가를 바탕으로 별도 결정합니다.</p>
<hr /><h2 style="color:#1e3a5f;">참고 자료</h2><ul><li><a href="https://scikit-learn.org/stable/modules/cross_validation.html" rel="nofollow">scikit-learn: 교차 검증</a></li><li><a href="https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.KFold.html" rel="nofollow">scikit-learn: KFold</a></li><li><a href="https://scikit-learn.org/stable/common_pitfalls.html" rel="nofollow">scikit-learn: 전처리와 데이터 누수</a></li><li><a href="https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GroupKFold.html" rel="nofollow">scikit-learn: GroupKFold</a></li><li><a href="https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.TimeSeriesSplit.html" rel="nofollow">scikit-learn: TimeSeriesSplit</a></li></ul>]]></description>
<dc:creator>관리자</dc:creator>
<dc:date>2026-10-05T07:22:14+09:00</dc:date>
</item>


<item>
<title>PCA 차원 축소, 열을 고르는 것과 새 축을 만드는 것의 차이</title>
<link>https://nusu.devtechinfo.xyz/blog/pca-%EC%B0%A8%EC%9B%90-%EC%B6%95%EC%86%8C-%EC%97%B4%EC%9D%84-%EA%B3%A0%EB%A5%B4%EB%8A%94-%EA%B2%83%EA%B3%BC-%EC%83%88-%EC%B6%95%EC%9D%84/</link>
<description><![CDATA[<p>표의 열이 많을 때 PCA를 쓰면 중요한 열 몇 개만 남는다고 생각하기 쉽습니다. 일반적인 PCA는 원래 열을 골라 남기는 방법이 아니라 여러 특성을 선형 결합해 새로운 좌표축을 만드는 방법입니다.</p>
<p>이 차이를 알아야 변환된 숫자를 원래 변수처럼 해석하는 실수를 줄일 수 있습니다. 이 글은 주성분과 설명 분산, 스케일링 및 평가의 관계를 개념 중심으로 정리합니다.</p>
<p>아래의 도형과 비율 예시는 이해를 위한 가정이며 실제 데이터 분석 결과나 성능 보장이 아닙니다.</p>
<p style="margin:24px 0 8px;"><img src="https://devtechinfo.xyz/data/editor/2610/ai-1d237121f73eda49f68c.png" alt="PCA 차원 축소, 열을 고르는 것과 새 축을 만드는 것의 차이 관련 설명용 삽화" width="1200" height="1024" style="height:auto;" /></p>
<p style="font-size:14px;color:#64748b;margin:0 0 24px;">AI 생성 삽화 · 개념 이해를 위한 AI 연출 이미지이며 실제 시스템 구성도나 측정 결과가 아닙니다.</p>
<blockquote style="border-left:4px solid #1e3a5f;background:#f1f5f9;padding:16px 20px;margin:24px 0;"><p><strong>핵심 정리</strong><br />PCA는 변동을 잘 표현하는 새 축을 찾고 데이터를 그 축의 좌표로 바꿉니다. 설명 분산은 예측 정확도가 아니며, 전처리와 주성분 학습은 평가 데이터와 분리해 검증해야 합니다.</p></blockquote>
<hr /><h2 style="color:#1e3a5f;">1. 열 선택과 좌표 변환을 구분합니다</h2>
<p>두 개의 수치 열로 표현한 점들이 대각선 방향으로 길게 늘어서 있다고 가정합니다. 원래 가로축이나 세로축 하나만 남기는 대신 점들이 길게 놓인 방향을 새 축으로 삼으면 그 방향의 위치로 데이터를 표현할 수 있습니다.</p>
<p>이것이 PCA의 직관을 설명하는 간단한 그림입니다. 실제 PCA는 여러 특성을 조합한 서로 직교하는 축을 순서대로 구하며, 앞쪽 축이 더 많은 분산을 설명하도록 구성됩니다.</p>
<p>scikit-learn의 분해 문서도 PCA를 이런 주성분으로 데이터를 표현하는 변환으로 설명합니다. 변환 후 첫 번째 열은 원래 첫 번째 특성을 그대로 복사한 값이 아닙니다.</p>
<p>따라서 첫 주성분을 나이나 가격 같은 원래 이름으로 바꾸어 부르면 의미가 달라집니다. 새 좌표의 해석에는 원래 특성이 얼마나 반영됐는지와 사용한 전처리 조건이 함께 필요합니다.</p>
<p>단순히 열 수가 줄었다는 사실과 원래 변수 몇 개를 선택했다는 사실을 구분하는 것이 출발점입니다.</p>
<p><a href="https://scikit-learn.org/stable/modules/decomposition.html#pca" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">2. 차원을 줄이면 남기지 않은 방향의 정보가 빠집니다</h2>
<p>새 축을 모두 사용하는 표현과 일부 축만 남기는 차원 축소는 다릅니다. 설명용 평면에서 점들이 대각선 주변에 조금씩 퍼져 있다면 긴 방향 하나로만 나타낼 때 그 선에서 벗어난 정도는 그대로 보존되지 않습니다.</p>
<p>원래 공간으로 되돌린 근사값이 원본과 다를 수 있는 이유입니다. 이를 단순히 오류가 발생했다고 표현하기보다 선택한 차원 수에서 무엇을 보존하고 무엇을 버렸는지 살펴봅니다.</p>
<p>주성분 개수가 작으면 저장과 후속 계산에 유리할 수 있지만, 변환 계산 자체의 비용과 정보 손실도 고려해야 합니다. 모든 데이터에서 속도와 품질이 동시에 좋아진다고 보장할 수는 없습니다.</p>
<p>차원 축소를 적용하기 전에 시각화가 목적인지, 후속 모델 입력을 줄이는 것이 목적인지 정합니다. 같은 두 차원 표현이라도 그림을 보는 용도와 서비스 예측용으로 쓰는 기준은 다를 수 있습니다.</p>
<p>목적을 적어 두면 주성분 수를 선택한 이유를 설명하기 쉽습니다.</p>
<hr /><h2 style="color:#1e3a5f;">3. 설명 분산 비율을 정확도로 읽지 않습니다</h2>
<p>scikit-learn의 PCA는 각 주성분이 설명하는 분산 비율을 제공합니다. 설명용 결과로 첫 축이 0.7, 다음 축이 0.2라고 가정하면 두 축의 누적 비율은 0.9입니다.</p>
<p>이는 그 표현에서 데이터 변동을 어느 정도 담았는지 설명하는 수치이며 정답을 90퍼센트 맞혔다는 뜻이 아닙니다. 일반 PCA의 축 학습은 분류 정답을 목표로 직접 최적화하는 절차가 아닙니다.</p>
<p>따라서 분산이 작은 방향에도 특정 예측 문제에 중요한 단서가 있을 수 있습니다. 가상의 품질 분류에서 제품 대부분이 크기 차이를 보이지만 드문 작은 측정 차이가 불량 여부와 관계있다면, 큰 변동만 남기는 선택이 분류에 항상 유리하지는 않습니다.</p>
<p>이 예시는 실제 산업 데이터에 대한 주장이 아니라 평가 목적이 다름을 보여 주는 가정입니다. 분산 비율은 주성분 수를 검토하는 자료로 사용하고 최종 예측 성능은 별도의 검증 지표로 확인해야 합니다.</p>
<p><a href="https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">4. 측정 단위와 스케일링을 함께 살펴봅니다</h2>
<p>한 특성은 원 단위의 큰 숫자이고 다른 특성은 작은 범위의 비율이라면 변동의 크기가 단위에 영향을 받을 수 있습니다. scikit-learn의 PCA는 입력을 중심화하지만 각 특성의 스케일을 자동으로 같은 수준으로 맞추지는 않습니다.</p>
<p>같은 현상을 다른 단위로 표현했을 뿐인데 축의 방향이 달라질 수 있다는 점을 이해해야 합니다. 공식 스케일링 예제도 전처리 여부에 따라 주성분의 기여가 달라지는 모습을 보여 줍니다.</p>
<p>그렇다고 모든 문제에서 표준화가 무조건 정답이라는 뜻은 아닙니다. 원래 단위의 변동이 의미 있는 경우와 단위 차이를 줄여 비교하려는 경우를 구분합니다.</p>
<p>어떤 전처리를 했는지 기록하고 그 이유를 데이터의 의미와 연결합니다. 설명용으로 길이를 센티미터에서 밀리미터로 바꾸면 물체가 변한 것이 아니라 수치 표현이 바뀐 것입니다.</p>
<p>PCA 실험에서 이런 단위 변경이 결과에 미치는 영향을 확인하면 모델 선택 이전에 입력 표현의 역할을 이해하기 쉽습니다.</p>
<p><a href="https://scikit-learn.org/stable/auto_examples/preprocessing/plot_scaling_importance.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">5. 학습한 축을 새 데이터에도 동일하게 적용합니다</h2>
<p>PCA의 fit 단계는 입력 자료를 보고 변환에 필요한 축을 학습합니다. 평가 데이터를 먼저 섞어 축을 구하면 평가 대상의 정보가 전처리에 들어갈 수 있습니다.</p>
<p>scikit-learn의 공통 실수 안내는 이런 데이터 누수가 PCA 같은 변환에도 적용된다고 설명합니다. 기본적으로 학습 데이터로 필요한 전처리와 PCA를 학습하고 검증·테스트 데이터에는 학습된 변환을 적용합니다.</p>
<p>교차 검증에서는 각 분할의 학습 구간에서 변환을 학습하도록 파이프라인을 구성하는 방식을 검토할 수 있습니다. 서비스에서도 요청마다 새로운 축을 다시 학습하면 같은 좌표 이름이 다른 의미가 될 수 있습니다.</p>
<p>모델과 전처리 자료, 특성 순서를 함께 관리해야 결과를 재현하기 쉽습니다. 예를 들어 원래 열 순서가 바뀌었는데 같은 변환을 적용하면 숫자 배열의 크기는 맞아도 의미는 달라질 수 있습니다.</p>
<p>학습된 축의 버전과 입력 스키마를 연결해 보관하는 것이 중요합니다.</p>
<p><a href="https://scikit-learn.org/stable/common_pitfalls.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">6. 차원 수는 기준 실험과 함께 선택합니다</h2>
<p>PCA를 넣기 전의 방법을 기준으로 두고 같은 데이터 분할에서 비교합니다. 주성분 수를 바꿀 때는 설명 분산뿐 아니라 실제 목적에 맞는 품질 지표와 처리 비용을 함께 기록합니다.</p>
<p>시각화가 목적이라면 두 축에서 멀리 보이는 점들이 원래 공간에서도 같은 관계인지 과도하게 해석하지 않습니다. 그림에서 집단이 나뉘어 보인다는 사실만으로 실제 분류 성능이 검증된 것은 아닙니다.</p>
<p>실험 기록에는 원래 특성 수, 전처리, 주성분 수, 검증 방법과 결과를 나란히 적을 수 있습니다. 숫자가 좋아진 한 번의 실험만 고르기보다 동일한 기준으로 비교해야 적용 이유를 설명할 수 있습니다.</p>
<p>해석 가능성이 중요한 업무라면 새 축의 혼합된 의미가 받아들일 수 있는지도 검토합니다. 단순한 열 선택이나 원래 특성을 유지하는 방식이 목적에 더 맞을 수도 있습니다.</p>
<p>PCA는 차원을 줄이는 유용한 선택지지만, 분산을 잘 표현하는 일이 무엇을 해결해 주는지 명확할 때 효과를 평가하기 쉽습니다.</p>
<hr /><h2 style="color:#1e3a5f;">7. 자주 묻는 질문</h2>
<h3>Q1. PCA는 중요하지 않은 열을 삭제하는 방법인가요?</h3>
<p>보통은 여러 특성을 조합해 새 축을 만드는 변환입니다. 원래 열 일부를 그대로 남기는 특성 선택과 구분합니다.</p>
<h3>Q2. 설명 분산이 높으면 분류 정확도도 높은가요?</h3>
<p>두 값은 다른 것을 측정합니다. 정답 예측이 목적이면 별도의 검증 데이터와 품질 지표로 평가해야 합니다.</p>
<h3>Q3. PCA 전에 항상 표준화해야 하나요?</h3>
<p>특성의 단위와 변동에 부여할 의미에 따라 판단합니다. 자동으로 정답을 정하기보다 전처리 조건을 기록하고 같은 평가 기준으로 비교합니다.</p>
<h3>Q4. 테스트 데이터에도 fit을 다시 실행하나요?</h3>
<p>평가 과정에서는 학습 데이터로 구한 변환을 적용하는 방식이 기본입니다. 평가 데이터를 이용해 축을 학습하면 결과를 공정하게 판단하기 어려워질 수 있습니다.</p>
<hr /><h2 style="color:#1e3a5f;">참고 자료</h2><ul><li><a href="https://scikit-learn.org/stable/modules/decomposition.html#pca" rel="nofollow">scikit-learn: PCA 개념</a></li><li><a href="https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html" rel="nofollow">scikit-learn: PCA API</a></li><li><a href="https://scikit-learn.org/stable/auto_examples/preprocessing/plot_scaling_importance.html" rel="nofollow">scikit-learn: 스케일링의 영향</a></li><li><a href="https://scikit-learn.org/stable/common_pitfalls.html" rel="nofollow">scikit-learn: 전처리와 데이터 누수</a></li></ul>]]></description>
<dc:creator>관리자</dc:creator>
<dc:date>2026-10-04T07:23:42+09:00</dc:date>
</item>


<item>
<title>LLM 스트리밍과 첫 토큰 시간, 응답 시작과 완료를 나누어 보기</title>
<link>https://nusu.devtechinfo.xyz/blog/llm-%EC%8A%A4%ED%8A%B8%EB%A6%AC%EB%B0%8D%EA%B3%BC-%EC%B2%AB-%ED%86%A0%ED%81%B0-%EC%8B%9C%EA%B0%84-%EC%9D%91%EB%8B%B5-%EC%8B%9C%EC%9E%91%EA%B3%BC-%EC%99%84%EB%A3%8C%EB%A5%BC/</link>
<description><![CDATA[<p>LLM 답변이 한꺼번에 나타나는 대신 조금씩 표시되면 사용자는 일찍 읽기 시작할 수 있습니다. 하지만 응답이 일찍 보인다는 사실과 전체 작업이 빨리 끝났다는 사실은 다릅니다.</p>
<p>스트리밍을 이해하려면 요청을 보낸 시각, 첫 출력이 도착한 시각, 응답이 완성된 시각을 나누어 봐야 합니다. 이 글은 취준생과 주니어 개발자를 위해 첫 토큰 시간과 전체 응답 시간, 화면 표시 사이의 차이를 설명합니다.</p>
<p>아래의 시간 수치는 개념을 보여 주기 위한 가정이며 특정 모델의 실제 성능이나 비교 결과가 아닙니다.</p>
<p style="margin:24px 0 8px;"><img src="https://devtechinfo.xyz/data/editor/2610/ai-83b9ef4f6f392f892ca3.png" alt="LLM 스트리밍과 첫 토큰 시간, 응답 시작과 완료를 나누어 보기 관련 설명용 삽화" width="1200" height="1024" style="height:auto;" /></p>
<p style="font-size:14px;color:#64748b;margin:0 0 24px;">AI 생성 삽화 · 개념 이해를 위한 AI 연출 이미지이며 실제 시스템 구성도나 측정 결과가 아닙니다.</p>
<blockquote style="border-left:4px solid #1e3a5f;background:#f1f5f9;padding:16px 20px;margin:24px 0;"><p><strong>핵심 정리</strong><br />첫 토큰 시간은 응답 시작을, 전체 응답 시간은 끝까지 받는 시간을 설명합니다. 스트리밍 이벤트와 토큰을 같은 단위로 세지 말고, 생성 중·완료·중단 상태를 화면과 기록에서 구분합니다.</p></blockquote>
<hr /><h2 style="color:#1e3a5f;">1. 시작과 완료를 서로 다른 시계로 생각합니다</h2>
<p>설명을 위해 요청 시각을 0초, 첫 텍스트 수신을 0.8초, 마지막 텍스트 수신을 5초라고 정해 봅니다. 이 예시에서는 첫 내용을 기다리는 시간과 나머지 내용을 받는 시간이 구분됩니다.</p>
<p>0.8초에 글자가 보였다고 전체 답변이 0.8초 만에 만들어졌다고 말하면 안 됩니다. NVIDIA의 지표 설명에서 TTFT는 요청부터 첫 토큰을 받기까지의 시간이며, 전체 응답 지연은 전체 출력을 받기까지의 시간입니다.</p>
<p>도구마다 빈 응답이나 마지막 신호를 포함하는 기준이 다를 수 있으므로 측정 정의도 확인해야 합니다. 특히 서버 내부 생성 시각과 클라이언트 수신 시각을 섞으면 네트워크 구간이 빠지거나 중복될 수 있습니다.</p>
<p>비교표에는 무엇을 시작점과 끝점으로 사용했는지 적습니다. 사용자 화면을 평가한다면 실제로 읽을 수 있는 글자가 표시된 시각도 별도 항목으로 둘 수 있습니다.</p>
<p>첫 데이터 수신과 화면 렌더링은 동일한 동작이 아니기 때문입니다.</p>
<p><a href="https://docs.nvidia.com/nim/benchmarking/llm/latest/metrics.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">2. 스트리밍은 완성 전의 결과를 전달하는 방식입니다</h2>
<p>스트리밍은 출력 일부를 받는 동안 화면을 갱신할 수 있게 하는 전달 방식입니다. 이미 끝난 결과를 한 번에 받는 방식과 사용자가 기다리는 모습이 달라질 수 있습니다.</p>
<p>예를 들어 글 전체가 준비될 때까지 빈 화면을 유지하는 대신 제목과 첫 문장부터 보여 주는 식입니다. 그렇다고 모델의 모든 계산량이 자동으로 줄어드는 것은 아닙니다.</p>
<p>긴 응답은 첫 문장이 일찍 보여도 완료까지 시간이 걸릴 수 있습니다. 읽기 중심 화면과 완성된 구조가 필요한 처리도 구분합니다.</p>
<p>사람이 초안을 읽는 화면에서는 부분 표시가 유용하지만, 온전한 객체를 받아야 하는 후속 처리는 완료 조건을 따로 확인해야 합니다. 버튼의 상태도 응답 생성 중과 완료 후를 나누는 편이 명확합니다.</p>
<p>복사나 저장을 허용할 때는 현재 내용이 부분 결과인지 사용자가 알 수 있어야 합니다. 스트리밍 채택은 단순 속도 수치 하나보다 어떤 단계에서 사용자가 결과를 활용하는지를 기준으로 검토합니다.</p>
<hr /><h2 style="color:#1e3a5f;">3. 첫 이벤트가 첫 텍스트라는 보장은 없습니다</h2>
<p>스트림에는 본문 조각 외에 시작, 상태 변경, 연결 유지, 종료 같은 이벤트가 들어갈 수 있습니다. Claude의 공식 스트리밍 문서도 메시지 시작과 내용 블록의 변화, 종료 이벤트를 구분하고 있습니다.</p>
<p>따라서 첫 이벤트를 받자마자 첫 답변이 도착했다고 기록하면 실제 텍스트 표시 시간과 차이가 날 수 있습니다. 텍스트가 없는 이벤트는 상태 처리에 사용하고, 본문 조각은 해당 블록에 이어 붙이는 식으로 역할을 나눕니다.</p>
<p>이벤트 하나를 출력 토큰 하나로 간주하는 것도 피해야 합니다. 전송된 텍스트 조각의 경계와 모델이 다루는 토큰 경계는 같은 개념이 아닙니다.</p>
<p>화면에 열 번 갱신됐다는 사실만으로 열 토큰을 생성했다고 계산할 수는 없습니다. 사용 중인 API가 제공하는 사용량 정보와 이벤트 명세를 확인합니다.</p>
<p>서로 다른 제공자의 이벤트 이름이 같을 것이라고 기대하지 말고, 수신 처리 계층에서 실제 명세를 해석한 뒤 화면에 필요한 상태로 변환하는 것이 좋습니다.</p>
<p><a href="https://platform.claude.com/docs/en/build-with-claude/streaming" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">4. 전송 형식과 화면 상태를 나누어 설계합니다</h2>
<p>SSE는 서버가 클라이언트에 이벤트를 전달하는 데 쓰이는 형식입니다. MDN 설명에서는 UTF-8 텍스트와 줄 구분을 이용해 메시지를 표현하고 event와 data 같은 필드를 다룹니다.</p>
<p>이 형식 자체가 답변의 의미나 완료 여부를 결정해 주는 것은 아닙니다. 애플리케이션은 제공자 규칙에 맞춰 어떤 이벤트가 본문이고 어떤 신호가 완료인지 해석해야 합니다.</p>
<p>설명용 화면 상태를 준비 중, 수신 중, 완료, 중단으로 나누어 보면 처리가 선명해집니다. 준비 중에는 텍스트가 없을 수 있고, 수신 중에는 일부 문장만 있을 수 있습니다.</p>
<p>완료 표시를 언제 바꿀지는 약속된 종료 조건을 기준으로 정합니다. 임시로 화면에 추가한 문자열과 최종 보관할 결과도 구분합니다.</p>
<p>단순 문자열 덧붙이기만 구현하면 오류가 난 뒤에도 생성 중 표시가 계속 남을 수 있습니다. 정상 종료와 오류, 사용자의 취소를 각각 어떤 상태로 보여 줄지 미리 정해 두면 화면과 서버 기록을 함께 점검하기 쉽습니다.</p>
<p><a href="https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">5. 중간 실패를 완성된 답변으로 저장하지 않습니다</h2>
<p>스트리밍 연결이 시작됐어도 뒤에서 오류가 발생할 수 있습니다. Claude 문서 역시 이벤트 스트림 안에서 오류가 전달될 수 있음을 안내합니다.</p>
<p>일부 텍스트를 받은 상태에서 실패했다면 화면에 남아 있는 문장이 최종 결과인지 분명하게 표시해야 합니다. 예를 들어 설명용 요청 A가 두 문단을 받은 뒤 중단됐다고 가정합니다.</p>
<p>이때 새 요청 B의 결과를 A의 끝에 무조건 이어 붙이면 같은 내용이 반복되거나 서로 다른 답변이 합쳐질 수 있습니다. 재시도 요청과 기존 부분 결과를 어떤 관계로 보관할지 서비스가 정해야 합니다.</p>
<p>연결 복구가 자동으로 원래 생성의 정확한 이어쓰기를 뜻한다고 가정하지 않습니다. 일부 JSON 문자열처럼 문법적으로 아직 완성되지 않은 데이터는 최종 객체로 취급하지 않습니다.</p>
<p>사용 중인 도구가 부분 파싱을 지원하더라도 완료된 값과 임시 값을 구분해야 합니다. 오류 기록에는 요청 식별자, 마지막 확인 상태, 수신 여부를 남기되 민감한 원문 전체를 불필요하게 저장하지 않는 방법을 선택합니다.</p>
<p><a href="https://platform.claude.com/docs/en/build-with-claude/streaming" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">6. 측정 조건을 고정하고 체감과 완료 지표를 함께 봅니다</h2>
<p>두 구현을 비교할 때 질문과 출력 조건이 다르면 지연 차이를 스트리밍 효과로만 설명하기 어렵습니다. 설명용 점검표에는 입력 길이, 출력 제한, 동시 요청 수, 모델 설정, 측정 위치를 넣을 수 있습니다.</p>
<p>처음 표시되는 시각이 줄었어도 전체 완료 시각이 같거나 더 늦을 수 있으므로 둘 다 기록합니다. 한 번의 빠른 요청만 골라 결론을 내리지 않고 여러 요청에서 느린 구간도 살펴봅니다.</p>
<p>특히 화면이 텍스트를 모아 일정 간격으로 표시한다면 서버 수신 기록과 사용자가 보는 갱신 간격이 다를 수 있습니다. 이때는 요청 전송, 첫 유효 텍스트 수신, 첫 화면 표시, 완료 처리 시각을 나란히 두어 어느 구간을 개선할지 찾습니다.</p>
<p>숫자 옆에 성공과 중단 여부를 남겨야 빠르게 실패한 요청이 좋은 성능처럼 집계되는 일을 피할 수 있습니다. 최종적으로 시작 지연, 완료 지연, 오류율과 화면 상태를 함께 확인하면 스트리밍의 장점과 남은 문제를 더 정확하게 설명할 수 있습니다.</p>
<hr /><h2 style="color:#1e3a5f;">7. 자주 묻는 질문</h2>
<h3>Q1. 스트리밍을 켜면 모델 응답이 항상 빨라지나요?</h3>
<p>사용자가 일부 내용을 일찍 볼 수 있지만 전체 생성 시간 감소를 보장하지는 않습니다. 첫 출력과 완료 시간을 따로 측정해야 실제 변화를 알 수 있습니다.</p>
<h3>Q2. 첫 네트워크 이벤트로 TTFT를 계산해도 되나요?</h3>
<p>본문이 없는 상태 이벤트가 먼저 올 수 있으므로 측정 정의를 확인해야 합니다. 첫 유효 출력 수신과 화면 표시 시간도 서로 구분합니다.</p>
<h3>Q3. 텍스트 조각 수를 토큰 수로 보면 되나요?</h3>
<p>전송 조각과 모델 토큰의 경계는 같은 개념이 아닙니다. 사용량은 제공되는 집계 정보와 해당 API의 명세를 기준으로 확인합니다.</p>
<h3>Q4. 응답이 중간에 끊겼으면 받은 부분을 지워야 하나요?</h3>
<p>부분 결과를 유지할지는 제품 정책에 따라 정할 수 있습니다. 다만 완료된 답변과 구별해 표시하고, 재시도 결과와 무조건 이어 붙이지 않도록 설계합니다.</p>
<hr /><h2 style="color:#1e3a5f;">참고 자료</h2><ul><li><a href="https://docs.nvidia.com/nim/benchmarking/llm/latest/metrics.html" rel="nofollow">NVIDIA: LLM 추론 지표</a></li><li><a href="https://platform.claude.com/docs/en/build-with-claude/streaming" rel="nofollow">Claude: Streaming messages</a></li><li><a href="https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events" rel="nofollow">MDN: Server-sent events</a></li></ul>]]></description>
<dc:creator>관리자</dc:creator>
<dc:date>2026-10-03T07:21:40+09:00</dc:date>
</item>


<item>
<title>분류 평가의 macro와 micro 평균, 클래스별 점수를 합치는 방법</title>
<link>https://nusu.devtechinfo.xyz/blog/%EB%B6%84%EB%A5%98-%ED%8F%89%EA%B0%80%EC%9D%98-macro%EC%99%80-micro-%ED%8F%89%EA%B7%A0-%ED%81%B4%EB%9E%98%EC%8A%A4%EB%B3%84-%EC%A0%90%EC%88%98%EB%A5%BC-%ED%95%A9%EC%B9%98%EB%8A%94/</link>
<description><![CDATA[<p>분류 모델의 평가표에 F1 점수가 여러 줄로 나오면 어느 숫자를 비교해야 하는지 혼란스러울 수 있습니다. macro와 micro는 서로 다른 모델 종류가 아니라 여러 클래스의 평가 결과를 합치는 방식입니다.</p>
<p>같은 정답과 예측을 넣어도 합치는 순서가 다르면 숫자가 달라질 수 있습니다. 따라서 점수의 크기만 보기 전에 무엇을 동등하게 취급하고 무엇을 모아 계산하는지 이해해야 합니다.</p>
<p>이 글은 scikit-learn의 분류 평가 정의를 바탕으로 macro, micro, weighted 평균을 구분합니다. 예시는 표본 가중치를 사용하지 않는 단일 라벨 분류를 중심으로 설명하며 실제 데이터나 특정 모델의 성능을 보고한 결과는 아닙니다.</p>
<p style="margin:24px 0 8px;"><img src="https://devtechinfo.xyz/data/editor/2610/ai-e1d4f182cf62e3bbb7c1.png" alt="분류 평가의 macro와 micro 평균, 클래스별 점수를 합치는 방법 관련 설명용 삽화" width="1200" height="1024" style="height:auto;" /></p>
<p style="font-size:14px;color:#64748b;margin:0 0 24px;">AI 생성 삽화 · 개념 이해를 위한 AI 연출 이미지이며 실제 시스템 구성도나 측정 결과가 아닙니다.</p>
<blockquote style="border-left:4px solid #1e3a5f;background:#f1f5f9;padding:16px 20px;margin:24px 0;"><p><strong>핵심 정리</strong><br />macro는 클래스별 점수를 같은 비중으로 평균내고, micro는 클래스들의 TP·FP·FN을 먼저 합쳐 점수를 계산합니다. weighted는 클래스별 점수를 정답 표본 수로 가중하므로 micro와 같은 연산이 아닙니다.</p></blockquote>
<hr /><h2 style="color:#1e3a5f;">1. 먼저 클래스별 평가와 평균을 구분합니다</h2>
<p>각 클래스를 평가할 때는 그 클래스를 맞힌 경우와 잘못 예측한 경우를 나누어 볼 수 있습니다. TP는 해당 클래스를 올바르게 예측한 수, FP는 다른 클래스를 해당 클래스로 예측한 수, FN은 해당 클래스인 것을 다른 것으로 예측한 수입니다.</p>
<p>F1은 이 수들을 사용해 2TP를 2TP+FP+FN으로 나눈 값으로 표현할 수 있습니다. 여러 클래스에서 각각 계산한 F1을 어떻게 하나로 만들지가 평균 방식의 질문입니다.</p>
<p>F1과 평균 종류를 분리해 생각하면 precision이나 recall에도 같은 평균 선택이 나타나는 이유를 이해하기 쉽습니다. 평가할 클래스 목록이 바뀌면 평균 대상도 달라질 수 있으므로 먼저 포함할 라벨을 정리합니다.</p>
<p>단순히 F1이라고만 적힌 보고서는 어느 평균인지 정보가 부족합니다. 점수 이름 옆에 average 설정과 평가 대상을 함께 기록하는 습관이 필요합니다.</p>
<p><a href="https://scikit-learn.org/stable/modules/generated/sklearn.metrics.f1_score.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">2. macro는 각 클래스를 한 표씩 반영합니다</h2>
<p>macro 평균은 클래스마다 계산한 지표를 같은 비중으로 평균냅니다. 어떤 클래스의 정답 표본이 많더라도 그 클래스의 점수 자체에 더 큰 비중을 주지는 않습니다.</p>
<p>따라서 표본이 적은 클래스의 성능을 평균에서 살펴보려는 목적에 유용할 수 있지만, 표본 부족으로 점수가 불안정한 문제까지 해결하는 것은 아닙니다. 한두 건의 예측 변화가 작은 클래스의 점수에 크게 영향을 줄 수 있으므로 클래스별 표본 수도 함께 봅니다.</p>
<p>macro F1을 계산할 때는 각 클래스의 F1을 구한 뒤 평균내야 합니다. 평균 precision과 평균 recall을 먼저 구해 그 둘의 조화평균을 내는 것은 일반적으로 다른 계산입니다.</p>
<p>점수를 직접 구현하거나 스프레드시트로 검증할 때 합치는 순서를 적어 두면 이 차이를 놓치기 어렵습니다. 평균 한 줄을 보기 전에 어느 클래스에서 낮은 값이 나왔는지도 확인합니다.</p>
<p><a href="https://scikit-learn.org/stable/modules/generated/sklearn.metrics.precision_recall_fscore_support.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">3. micro는 오류 수를 모은 뒤 계산합니다</h2>
<p>micro는 클래스별 TP, FP, FN을 각각 합쳐 전체 집계값으로 지표를 계산합니다. 클래스별 점수의 단순평균을 구하는 방식이 아니므로 macro와 결과가 달라도 계산 오류라고 단정하지 않습니다.</p>
<p>모든 클래스를 포함하는 단일 라벨 다중 클래스 분류에서 표본 가중치를 쓰지 않는 경우 micro F1은 accuracy와 같아집니다. 하지만 일부 라벨만 평가하거나 다중 라벨 문제를 다루면 그 관계를 그대로 적용할 수 없습니다.</p>
<p>평가 대상을 줄이고도 이전 보고서와 같은 지표라고 표시하면 비교 조건이 달라졌다는 사실을 놓칠 수 있습니다. 전체 예측의 집계 관점과 각 클래스의 관점을 함께 확인하려면 micro와 클래스별 결과를 나란히 기록할 수 있습니다.</p>
<p>큰 숫자 하나가 서비스의 모든 오류를 충분히 설명하지는 않으므로 어떤 종류의 실수가 중요한지는 별도 업무 기준으로 정합니다.</p>
<p><a href="https://scikit-learn.org/stable/modules/generated/sklearn.metrics.classification_report.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">4. 간단한 가상 예시로 차이를 계산합니다</h2>
<p>정답이 A인 표본 90개와 B인 표본 10개가 있고 모델이 100개를 모두 A로 예측했다고 가정합니다. A의 TP는 90, FP는 10, FN은 0이므로 A의 F1은 180/190으로 약 0.947입니다.</p>
<p>B는 TP가 0이고 FN이 10이므로 F1이 0입니다. 두 클래스의 macro F1은 이 두 값을 평균낸 약 0.474가 됩니다.</p>
<p>micro에서는 TP 합이 90, FP 합이 10, FN 합이 10이므로 F1은 180/200인 0.9입니다. 두 숫자는 같은 예측을 다른 방식으로 요약한 결과입니다.</p>
<p>0.9만 보면 높은 성능처럼 느낄 수 있지만 이 예시에서는 B를 한 건도 맞히지 못했습니다. 반대로 macro 값만으로 전체 오류 건수를 바로 알 수도 없습니다.</p>
<p>실제 보고에서는 계산 조건과 클래스별 결과를 함께 제시해야 숫자가 무엇을 의미하는지 독자가 판단할 수 있습니다.</p>
<hr /><h2 style="color:#1e3a5f;">5. weighted와 계산 불가능한 항목을 구분합니다</h2>
<p>weighted 평균은 클래스별 점수를 정답 표본 수인 support에 따라 가중합니다. 앞 예시의 weighted F1은 A 점수에 0.9, B 점수에 0.1을 곱해 더한 약 0.853입니다.</p>
<p>micro F1인 0.9와 다른 것을 직접 확인할 수 있습니다. 어느 평균이 항상 더 높거나 더 적절하다고 정하기보다 평가 목적과 데이터 구성을 기준으로 선택합니다.</p>
<p>한편 어떤 클래스가 한 번도 예측되지 않으면 precision처럼 분모가 0이 되는 지표가 생길 수 있습니다. scikit-learn의 zero_division 설정은 이런 경우의 반환값과 경고 처리에 영향을 줍니다.</p>
<p>표시된 0이 일반적인 계산 결과인지 설정에 따른 처리인지도 확인해야 합니다. 앞 예시에서 B의 F1이 0인 것과 B의 precision 분모가 0인 것은 같은 설명이 아닙니다.</p>
<p>평가 코드와 함께 관련 옵션을 기록하면 결과를 재현할 때 해석 차이를 줄일 수 있습니다.</p>
<p><a href="https://scikit-learn.org/stable/modules/generated/sklearn.metrics.precision_recall_fscore_support.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">6. 평가표에는 평균 외에 비교 조건을 남깁니다</h2>
<p>classification_report는 클래스별 precision, recall, F1과 support를 살펴보는 데 사용할 수 있습니다. 평균 점수만 복사하기보다 라벨 이름과 순서가 맞는지, 비교하는 두 실행의 평가 데이터가 같은지 확인합니다.</p>
<p>혼동행렬을 함께 보면 실제 클래스가 어느 클래스로 예측됐는지 살펴볼 수 있습니다. 정규화된 비율인지 원래 건수인지도 구분해 적습니다.</p>
<p>작은 실습에서는 먼저 몇 개의 정답과 예측을 손으로 세고 함수 결과와 대조하는 방식이 도움이 됩니다. 운영 평가에서는 평가셋 버전, 라벨 목록, 평균 종류, zero_division과 표본 가중치 사용 여부를 기록할 수 있습니다.</p>
<p>점수가 좋아졌더라도 특정 중요 클래스가 악화됐는지 별도로 검토합니다. 평균 방식을 바꿔 높은 숫자를 얻는 것과 실제 모델 예측이 개선되는 것은 다른 일입니다.</p>
<p>비교 목적을 정한 뒤 같은 조건의 지표를 지속적으로 사용하는 것이 좋습니다.</p>
<p><a href="https://scikit-learn.org/stable/modules/generated/sklearn.metrics.confusion_matrix.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">7. 자주 묻는 질문</h2>
<h3>Q1. macro F1은 precision 평균과 recall 평균으로 계산하나요?</h3>
<p>클래스별 F1을 먼저 계산한 뒤 같은 비중으로 평균냅니다. 평균 precision과 평균 recall로 F1을 만드는 계산과는 일반적으로 다릅니다.</p>
<h3>Q2. micro와 weighted는 같은 뜻인가요?</h3>
<p>micro는 TP·FP·FN을 모아서 지표를 계산하고 weighted는 클래스별 지표를 support로 가중합니다. 같은 예측에서도 값이 다를 수 있습니다.</p>
<h3>Q3. micro F1은 언제나 정확도와 같나요?</h3>
<p>모든 클래스를 포함한 단일 라벨 분류라는 조건 등을 확인해야 합니다. 일부 라벨 평가나 다중 라벨 문제에는 같은 관계를 무조건 적용하지 않습니다.</p>
<h3>Q4. 평균이 높으면 소수 클래스도 잘 맞히나요?</h3>
<p>평균만으로는 특정 클래스의 성능을 확정할 수 없습니다. 클래스별 지표와 support, 혼동행렬을 함께 확인합니다.</p>
<hr /><h2 style="color:#1e3a5f;">참고 자료</h2><ul><li><a href="https://scikit-learn.org/stable/modules/generated/sklearn.metrics.precision_recall_fscore_support.html" rel="nofollow">scikit-learn 클래스별 지표와 평균 정의</a></li><li><a href="https://scikit-learn.org/stable/modules/generated/sklearn.metrics.f1_score.html" rel="nofollow">scikit-learn F1 score</a></li><li><a href="https://scikit-learn.org/stable/modules/generated/sklearn.metrics.classification_report.html" rel="nofollow">scikit-learn classification report</a></li><li><a href="https://scikit-learn.org/stable/modules/generated/sklearn.metrics.confusion_matrix.html" rel="nofollow">scikit-learn confusion matrix</a></li></ul>]]></description>
<dc:creator>관리자</dc:creator>
<dc:date>2026-10-01T07:17:42+09:00</dc:date>
</item>


<item>
<title>LLM 컨텍스트와 출력 길이, 입력 공간과 응답 한도를 나누어 이해하기</title>
<link>https://nusu.devtechinfo.xyz/blog/llm-%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8%EC%99%80-%EC%B6%9C%EB%A0%A5-%EA%B8%B8%EC%9D%B4-%EC%9E%85%EB%A0%A5-%EA%B3%B5%EA%B0%84%EA%B3%BC-%EC%9D%91%EB%8B%B5-%ED%95%9C%EB%8F%84%EB%A5%BC/</link>
<description><![CDATA[<p>LLM에 긴 문서를 넣을 수 있다는 설명과 긴 답변을 생성할 수 있다는 설명은 같은 뜻이 아닙니다. 모델이 한 요청에서 참고할 수 있는 컨텍스트 공간과 새로 생성할 출력의 한도는 구분해서 봐야 합니다.</p>
<p>대화 기록, 시스템 지시, 도구 결과가 함께 들어가면 사용자가 방금 붙인 문서만 세어서는 전체 입력을 파악하기 어렵습니다. 이 글은 특정 모델의 최대 수치를 나열하기보다 컨텍스트와 출력 길이의 관계, 토큰 계산, 응답 중단 이유를 정리합니다.</p>
<p>구체적인 한도와 처리 방식은 모델과 API마다 달라질 수 있으므로 사용하는 제품의 공식 문서를 확인해야 합니다.</p>
<p style="margin:24px 0 8px;"><img src="https://devtechinfo.xyz/data/editor/2609/ai-8e385b7c29bdbb7c5bd8.png" alt="LLM 컨텍스트와 출력 길이, 입력 공간과 응답 한도를 나누어 이해하기 관련 설명용 삽화" width="1200" height="1024" style="height:auto;" /></p>
<p style="font-size:14px;color:#64748b;margin:0 0 24px;">AI 생성 삽화 · 개념 이해를 위한 AI 연출 이미지이며 실제 시스템 구성도나 측정 결과가 아닙니다.</p>
<blockquote style="border-left:4px solid #1e3a5f;background:#f1f5f9;padding:16px 20px;margin:24px 0;"><p><strong>핵심 정리</strong><br />컨텍스트는 현재 요청에서 참고하는 정보와 생성 공간을 이해하는 개념이고, 출력 한도는 새 응답에 적용되는 제한입니다. 글자 수를 토큰 수로 고정 환산하지 말고 실제 요청 구성과 중단 이유를 함께 확인합니다.</p></blockquote>
<hr /><h2 style="color:#1e3a5f;">1. 컨텍스트는 지금 참고하는 작업 공간입니다</h2>
<p>모델이 학습 과정에서 접한 데이터와 지금 요청에 포함된 정보는 구분해야 합니다. 컨텍스트는 현재 응답을 만들 때 참고하는 요청 내용과 생성 공간을 설명하는 개념입니다.</p>
<p>Claude의 공식 문서는 컨텍스트 창을 대화 이력과 새 출력 등을 포함하는 공간으로 설명합니다. 여기에는 사용자의 마지막 문장뿐 아니라 시스템 지시와 이전 메시지, 도구 결과 등도 영향을 줄 수 있습니다.</p>
<p>특정 서비스가 과거 대화를 어떻게 선택하거나 요약해서 전달하는지는 별도 구현 사항입니다. 화면에 예전 대화가 보인다는 이유만으로 모든 내용이 현재 요청에 그대로 들어갔다고 확정할 수는 없습니다.</p>
<p>학습 자료를 정리할 때에는 모델이 알고 있을 수 있는 배경 지식, 애플리케이션이 전달한 기록, 이번에 넣은 문서를 나누어 적는 편이 좋습니다. 현재 요청의 구성부터 확인해야 긴 자료를 넣었을 때 어떤 정보가 실제로 참고 대상인지 설명할 수 있습니다.</p>
<p><a href="https://platform.claude.com/docs/en/build-with-claude/context-windows" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">2. 출력 한도는 답변 분량과 별도로 해석합니다</h2>
<p>출력 한도는 한 응답에서 생성할 수 있는 토큰 수에 관한 제한입니다. 입력으로 긴 문서를 받을 수 있는 모델이라도 같은 크기의 답변을 생성할 수 있다는 뜻은 아닙니다.</p>
<p>또한 출력 한도를 크게 지정했다고 반드시 그만큼 길게 작성하는 것은 아닙니다. 자연스럽게 답변을 끝내거나 다른 종료 조건이 적용될 수 있습니다.</p>
<p>설명용으로 입력 공간이 넉넉한 가상 모델을 생각해도 문서 요약을 한 문장으로 요청하면 짧게 답하는 것이 목적에 맞습니다. 원하는 분량은 내용 요구와 형식으로 전달하고 API 한도는 생성 가능 범위를 관리하는 설정으로 구분합니다.</p>
<p>글자 수로 원고를 관리하는 서비스라면 응답 후 실제 글자 수를 확인하는 절차가 필요합니다. 토큰 한도와 한국어 글자 수가 같은 숫자로 대응한다고 가정하지 않습니다.</p>
<p>출력이 짧다는 현상을 모두 한도 부족으로 진단하기 전에 요청 내용과 종료 이유를 함께 살펴봅니다.</p>
<p><a href="https://platform.claude.com/docs/en/build-with-claude/handling-stop-reasons" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">3. 토큰은 글자나 단어와 일대일로 같지 않습니다</h2>
<p>토큰 수는 사용하는 모델과 토크나이저, 텍스트 구성에 따라 달라질 수 있습니다. 한국어 문장, 영문 코드, 숫자와 기호가 섞인 자료를 동일한 고정 비율로 계산하면 실제 요청 크기와 차이가 날 수 있습니다.</p>
<p>이미지나 문서, 도구 정의가 포함되는 경우도 해당 API의 계산 방식을 확인해야 합니다. Claude는 요청의 토큰 수를 추정할 수 있는 별도 기능을 문서로 제공합니다.</p>
<p>이 기능을 사용할 때에도 실제로 호출할 모델과 요청 구성을 기준으로 확인하는 것이 중요합니다. 설명용 예산표에는 지시문, 대화 이력, 참고 문서, 도구 결과, 출력 예정 분량을 별도 칸에 적을 수 있습니다.</p>
<p>이 표의 숫자를 손으로 추정했다면 실제 측정값이라고 표시하지 않습니다. 예측과 사용 결과를 비교해 반복적으로 관리하는 편이 단순한 글자 수 환산보다 명확합니다.</p>
<p>모델을 바꿀 때는 이전 측정이 그대로 적용된다고 가정하지 않습니다.</p>
<p><a href="https://platform.claude.com/docs/en/build-with-claude/token-counting" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">4. 잘린 답변은 중단 이유부터 확인합니다</h2>
<p>응답이 문장 중간에서 끝났다면 텍스트만 보고 원인을 확정하지 않습니다. API가 제공하는 종료 정보와 오류를 함께 확인해야 합니다.</p>
<p>Claude의 공식 문서는 max_tokens를 요청에서 지정한 생성 한도에 도달한 종료 이유로 설명하며 다른 종료 유형도 구분합니다. 정상적인 답변 종료와 도구 호출을 위한 멈춤, 한도 도달을 같은 상황으로 처리하면 후속 로직이 잘못될 수 있습니다.</p>
<p>예를 들어 JSON 결과가 완성됐는지 확인하는 서비스라면 응답 문자열이 존재한다는 사실만으로 성공 처리하지 않습니다. 종료 이유와 필요한 형식의 완결성을 함께 살펴봐야 합니다.</p>
<p>이 예시는 특정 API의 모든 오류 처리를 대신하는 코드는 아닙니다. 사용하는 서비스의 응답 필드와 현재 문서를 기준으로 분기 조건을 정리해야 합니다.</p>
<p>문제가 반복될 때는 요청 크기, 출력 설정, 실제 사용량, 종료 유형을 함께 기록하면 원인을 구분하는 데 도움이 됩니다.</p>
<p><a href="https://platform.claude.com/docs/en/build-with-claude/handling-stop-reasons" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">5. 더 많은 문서가 항상 더 좋은 답을 만들지는 않습니다</h2>
<p>컨텍스트 공간이 남았다고 관련성이 낮은 자료까지 모두 넣는 것이 언제나 유리한 것은 아닙니다. Anthropic의 컨텍스트 엔지니어링 자료는 필요한 정보를 선별하고 유한한 공간을 관리하는 접근을 설명합니다.</p>
<p>오래된 설명과 새 지침이 섞이거나 같은 내용이 반복되면 무엇이 현재 기준인지 명확히 할 필요가 있습니다. 설명용으로 제품 안내 두 판본을 넣는다면 최신 날짜와 적용 범위, 이전 판본을 참고하는 이유를 표시할 수 있습니다.</p>
<p>요약을 사용할 경우에는 원문에서 빠진 조건이 있는지도 확인해야 합니다. 공간을 줄였다는 사실만으로 정보가 모두 보존됐다고 보지는 않습니다.</p>
<p>긴 원문을 여러 부분으로 나눠 처리한다면 마지막에 합칠 때 중복과 빠진 항목을 점검할 계획도 필요합니다. 자료의 양과 필요한 근거의 충실함을 같은 말로 쓰지 않고 질문에 답하는 데 필요한 내용을 중심으로 구성하는 편이 좋습니다.</p>
<p><a href="https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agents" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">6. 요청 예산과 결과 검증을 함께 설계합니다</h2>
<p>긴 원고를 작성하는 가상 작업을 생각해 보면 주제 지시, 참고 문서, 이전 결과, 새 출력이 하나의 처리 과정에 들어갑니다. 먼저 어떤 정보가 이번 요청에 필요한지 정하고 실제 모델 기준으로 입력 규모를 확인합니다.</p>
<p>그다음 출력에 필요한 여유와 모델의 별도 생성 한도를 확인합니다. 한도에 맞췄다는 사실만으로 원고 품질이 검증된 것은 아니므로 결과의 분량과 항목 누락, 출처 연결도 따로 살펴봅니다.</p>
<p>실패한 요청을 같은 조건으로 반복하기보다 종료 이유에 따라 자료 선별이나 작업 분할, 출력 설정을 조정하는 것이 합리적입니다. 여러 단계로 나눴다면 각 단계의 입력과 결과 버전을 기록해 이전 답을 잘못 재사용하지 않게 합니다.</p>
<p>이 절차는 특정 모델 수치를 외우는 것보다 환경이 바뀌었을 때 적용하기 쉽습니다. 컨텍스트는 참고 범위, 출력 한도는 생성 제한, 결과 검증은 요구 충족 확인이라는 세 질문을 구분해서 정리하면 됩니다.</p>
<hr /><h2 style="color:#1e3a5f;">7. 자주 묻는 질문</h2>
<h3>Q1. 컨텍스트가 크면 답변도 같은 길이로 만들 수 있나요?</h3>
<p>입력과 생성 공간의 관계 및 별도 출력 한도를 확인해야 합니다. 큰 컨텍스트가 같은 크기의 응답을 보장하지는 않습니다.</p>
<h3>Q2. 4000자를 원하면 출력 토큰을 4000으로 정하면 되나요?</h3>
<p>토큰과 글자 수는 일대일로 대응하지 않습니다. 분량 요구를 전달하고 생성 후 실제 글자 수를 별도로 확인합니다.</p>
<h3>Q3. 대화 화면에 있는 내용은 전부 현재 컨텍스트인가요?</h3>
<p>서비스가 기록을 선택하거나 요약하는 방식에 따라 달라질 수 있습니다. 실제 요청 구성이나 공식 동작 설명으로 확인해야 합니다.</p>
<h3>Q4. 응답이 끊기면 출력 한도만 늘리면 되나요?</h3>
<p>먼저 종료 이유와 오류, 요청 규모를 확인합니다. 원인에 따라 입력 정리나 작업 분할 등 다른 조정이 필요할 수 있습니다.</p>
<hr /><h2 style="color:#1e3a5f;">참고 자료</h2><ul><li><a href="https://platform.claude.com/docs/en/build-with-claude/context-windows" rel="nofollow">Claude: 컨텍스트 창의 구성</a></li><li><a href="https://platform.claude.com/docs/en/build-with-claude/token-counting" rel="nofollow">Claude: 토큰 수 계산</a></li><li><a href="https://platform.claude.com/docs/en/build-with-claude/handling-stop-reasons" rel="nofollow">Claude: 응답 중단 이유</a></li><li><a href="https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agents" rel="nofollow">Anthropic: 컨텍스트 엔지니어링</a></li></ul>]]></description>
<dc:creator>관리자</dc:creator>
<dc:date>2026-09-29T07:48:13+09:00</dc:date>
</item>


<item>
<title>층화 분할과 무작위 분할, 클래스 비율과 평가 조건 구분하기</title>
<link>https://nusu.devtechinfo.xyz/blog/%EC%B8%B5%ED%99%94-%EB%B6%84%ED%95%A0%EA%B3%BC-%EB%AC%B4%EC%9E%91%EC%9C%84-%EB%B6%84%ED%95%A0-%ED%81%B4%EB%9E%98%EC%8A%A4-%EB%B9%84%EC%9C%A8%EA%B3%BC-%ED%8F%89%EA%B0%80-%EC%A1%B0%EA%B1%B4/</link>
<description><![CDATA[<p>분류 데이터를 학습용과 평가용으로 나눌 때 무작위 분할을 했는데 평가 데이터에 드문 클래스가 거의 없는 상황이 생길 수 있습니다. 층화 분할은 이런 문제를 줄이기 위해 클래스 비율을 나눈 집합에서도 비슷하게 유지하려는 방법입니다.</p>
<p>그러나 비율을 맞췄다는 사실이 데이터 누수나 시간 순서 문제까지 해결했다는 뜻은 아닙니다. 이 글은 무작위 분할과 층화 분할의 차이, 재현성 설정, 그룹과 시간 조건의 우선순위를 정리합니다.</p>
<p>숫자는 개념 설명을 위한 가상 예시이며 특정 데이터에서 동일한 분할 결과가 나온다는 보장은 아닙니다.</p>
<p style="margin:24px 0 8px;"><img src="https://devtechinfo.xyz/data/editor/2609/ai-18fd018e3f3816587a17.png" alt="층화 분할과 무작위 분할, 클래스 비율과 평가 조건 구분하기 관련 설명용 삽화" width="1200" height="1024" style="height:auto;" /></p>
<p style="font-size:14px;color:#64748b;margin:0 0 24px;">AI 생성 삽화 · 개념 이해를 위한 AI 연출 이미지이며 실제 시스템 구성도나 측정 결과가 아닙니다.</p>
<blockquote style="border-left:4px solid #1e3a5f;background:#f1f5f9;padding:16px 20px;margin:24px 0;"><p><strong>핵심 정리</strong><br />층화 분할은 클래스 비율을 고려하는 분할입니다. 데이터의 독립성이나 시간 순서까지 자동으로 보장하지 않으므로 평가하려는 상황과 그룹 구조를 먼저 확인합니다.</p></blockquote>
<hr /><h2 style="color:#1e3a5f;">1. 무작위 분할은 샘플을 나누는 기본 방식입니다</h2>
<p>무작위 분할은 샘플을 임의의 순서나 선택 규칙에 따라 학습 집합과 평가 집합으로 나누는 방식입니다. scikit-learn의 train_test_split은 배열을 함께 분할하는 도구이며 무작위 상태와 층화 여부 등을 지정할 수 있습니다.</p>
<p>같은 샘플의 특징과 정답을 따로 섞으면 대응이 깨질 수 있으므로 같은 분할 기준을 사용해야 합니다. 설명용으로 문서 100개가 있고 그중 특정 클래스가 10개라고 가정합니다.</p>
<p>평가용 20개를 무작위로 골랐을 때 해당 클래스가 정확히 2개 포함된다고 보장되지는 않습니다. 이 숫자는 비율과 실제 선택 결과가 다를 수 있다는 점을 보여 주기 위한 것입니다.</p>
<p>작은 데이터나 드문 클래스에서는 분할 결과의 차이가 평가 해석에 영향을 줄 수 있습니다. 분할 뒤에는 전체 개수뿐 아니라 각 집합의 클래스별 수량도 확인하는 편이 좋습니다.</p>
<p><a href="https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">2. 층화는 클래스 구성 비율을 고려합니다</h2>
<p>층화 분할은 주어진 클래스 정보를 기준으로 각 집합의 비율이 원래 구성과 비슷하도록 나누려는 방식입니다. scikit-learn에서는 stratify에 클래스 레이블을 전달하는 형태로 사용할 수 있습니다.</p>
<p>단순히 데이터를 무작위로 나눈 뒤 부족한 클래스를 복사해 넣는 절차와는 다릅니다. 앞의 가상 예시에서 전체의 특정 클래스 비율이 10퍼센트라면 평가 집합에서도 그와 비슷한 구성을 목표로 삼는다고 이해할 수 있습니다.</p>
<p>실제 정수 개수와 분할 크기 때문에 모든 비율을 정확히 맞출 수 있는 것은 아닙니다. 데이터가 너무 적거나 드문 클래스의 수가 부족하면 원하는 분할을 구성하지 못할 수 있으므로 함수의 조건과 오류를 확인해야 합니다.</p>
<p>층화를 켰다는 설정만 기록하지 말고 사용한 레이블과 최종 수량을 함께 남기는 것이 좋습니다. 그래야 어떤 특성을 유지하려고 했는지 다른 사람이 이해할 수 있습니다.</p>
<p><a href="https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html" rel="nofollow">관련 공식 문서</a></p>
<p><a href="https://scikit-learn.org/stable/modules/cross_validation.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">3. 같은 사용자의 자료는 그룹 조건을 먼저 봅니다</h2>
<p>한 사용자가 만든 여러 문서나 한 장치에서 반복 수집한 기록처럼 샘플 사이에 묶음이 있을 수 있습니다. 같은 그룹의 자료가 학습과 평가에 동시에 들어가면 실제로 평가하려던 새 그룹에 대한 성능과 다른 조건이 될 수 있습니다.</p>
<p>클래스 비율을 유지했다고 이런 중복이 자동으로 사라지지는 않습니다. scikit-learn의 GroupKFold는 그룹이 겹치지 않도록 나누는 도구의 한 예입니다.</p>
<p>적용할 방법은 평가 목적과 데이터 구조에 맞춰 선택해야 합니다. 설명용으로 사용자가 세 명이고 각자 여러 문서를 쓴 상황이라면 문서 수만 세기보다 사용자 식별자가 어느 집합에 있는지도 확인할 수 있습니다.</p>
<p>새 사용자를 대상으로 한 성능이 목표인지 기존 사용자의 새 문서를 대상으로 하는지에 따라 질문이 달라집니다. 그룹 구분이 필요한 자료를 임의로 행 단위로만 섞고 높은 점수만 보고하는 것은 피해야 합니다.</p>
<p><a href="https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GroupKFold.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">4. 미래 예측이라면 시간 순서가 중요합니다</h2>
<p>과거 자료로 학습해 이후 시점의 결과를 예측하려는 문제에서는 시간 순서가 평가 조건에 포함됩니다. 데이터를 무작위로 섞으면 미래 자료를 학습에 사용하고 과거를 평가하는 형태가 될 수 있습니다.</p>
<p>scikit-learn의 TimeSeriesSplit은 시간 순서를 고려하는 분할 도구이며 문서에 적용 조건도 설명돼 있습니다. 단순히 이 도구를 선택하면 모든 시계열 문제가 해결된다는 뜻은 아닙니다.</p>
<p>관측 간격과 특성 생성 시점, 평가 구간의 의미도 확인해야 합니다. 예를 들어 다음 달의 분류 결과를 예측하는 목적이라면 전체 기간의 클래스 비율을 맞추는 것보다 실제 예측 시점에 알 수 있던 자료만 사용하는지가 먼저입니다.</p>
<p>클래스 비율이 시간에 따라 달라지는 현상 자체가 평가 조건일 수도 있습니다. 분할 목적을 한 문장으로 적고 그 목적에 맞는 순서와 그룹 제약을 먼저 정한 뒤 비율 유지 여부를 검토합니다.</p>
<p><a href="https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.TimeSeriesSplit.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">5. 재현성 설정과 좋은 평가를 구분합니다</h2>
<p>random_state 같은 설정은 분할을 다시 확인하고 실험을 비교하는 데 도움이 됩니다. 그러나 동일한 분할을 재현할 수 있다는 사실이 그 분할이 평가 목적에 적합하다는 증거는 아닙니다.</p>
<p>높은 점수가 나오는 분할을 여러 번 찾아 최종 결과로 선택하면 비교의 의미가 달라질 수 있습니다. 실험 기록에는 분할 방식과 난수 설정, 데이터 버전, 집합별 수량을 함께 적습니다.</p>
<p>scikit-learn 문서는 층화가 일부 실용적인 문제를 줄이지만 평가 변동성을 작게 보이게 할 수도 있다고 설명합니다. 비율이 고르게 유지됐다는 이유만으로 불확실성이 사라졌다고 해석하지 않습니다.</p>
<p>설명용 보고서를 만든다면 평균 점수와 함께 어떤 조건을 바꾸지 않았는지, 어떤 자료에 적용한 결과인지 적을 수 있습니다. 재현성은 같은 조건을 다시 확인하는 기반이고 평가의 타당성은 목적과 데이터 구조를 별도로 검토해야 하는 문제입니다.</p>
<p><a href="https://scikit-learn.org/stable/modules/cross_validation.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">6. 분할 후 수량과 경계를 직접 점검합니다</h2>
<p>모델을 학습하기 전에 학습·검증·최종 평가 집합의 역할을 정리하고 샘플 식별자가 겹치는지 살펴봅니다. 그룹 구분이 있다면 그룹 목록의 교집합을 확인하고 시간 조건이 있다면 각 집합의 기간을 비교합니다.</p>
<p>클래스별 수량은 전체 비율과 함께 보되 너무 적은 클래스가 있는지 따로 확인합니다. 전처리 과정도 평가 데이터를 미리 학습에 사용하지 않도록 분할 경계를 따라야 합니다.</p>
<p>이 점검은 모델 점수를 높이기 위한 조정이 아니라 어떤 질문에 대한 결과인지 명확히 하는 과정입니다. 가상 문서 분류 실험이라면 전체 문서 수, 사용자 수, 기간, 클래스 수량을 한 표에 적어 서로 다른 분할의 조건을 비교할 수 있습니다.</p>
<p>이 글의 예시처럼 단순한 숫자로 연습한 뒤 실제 데이터에서는 중복과 그룹, 시간 정보를 함께 확인해야 합니다. 층화 여부 하나보다 평가 상황을 구체적으로 설명하는 능력이 먼저 필요합니다.</p>
<hr /><h2 style="color:#1e3a5f;">7. 자주 묻는 질문</h2>
<h3>Q1. 층화 분할은 무작위성을 없애는 방법인가요?</h3>
<p>클래스 비율을 고려하면서 무작위 선택을 사용할 수 있습니다. 비율 조건과 난수 설정은 서로 다른 항목입니다.</p>
<h3>Q2. stratify를 쓰면 데이터 누수가 없어지나요?</h3>
<p>클래스 구성만 고려하므로 그룹 중복이나 시간 순서 문제는 별도로 확인해야 합니다. 전처리의 학습 범위도 분할 경계를 따라야 합니다.</p>
<h3>Q3. 클래스가 아주 적어도 비율을 맞출 수 있나요?</h3>
<p>샘플 수와 분할 크기에 따라 구성에 제한이 생길 수 있습니다. 실제 수량과 도구의 조건을 확인하고 오류를 무시하지 않습니다.</p>
<h3>Q4. 난수 설정을 고정하면 평가가 공정해지나요?</h3>
<p>재현성을 돕지만 평가 목적에 맞는 분할인지까지 보장하지는 않습니다. 데이터 구조와 최종 평가 절차를 함께 검토합니다.</p>
<hr /><h2 style="color:#1e3a5f;">참고 자료</h2><ul><li><a href="https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html" rel="nofollow">scikit-learn: train_test_split</a></li><li><a href="https://scikit-learn.org/stable/modules/cross_validation.html" rel="nofollow">scikit-learn: 교차 검증과 층화의 한계</a></li><li><a href="https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GroupKFold.html" rel="nofollow">scikit-learn: GroupKFold</a></li><li><a href="https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.TimeSeriesSplit.html" rel="nofollow">scikit-learn: TimeSeriesSplit</a></li></ul>]]></description>
<dc:creator>관리자</dc:creator>
<dc:date>2026-09-29T07:48:13+09:00</dc:date>
</item>


<item>
<title>TCP와 UDP, 전송 방식과 애플리케이션의 책임 이해하기</title>
<link>https://nusu.devtechinfo.xyz/blog/tcp%EC%99%80-udp-%EC%A0%84%EC%86%A1-%EB%B0%A9%EC%8B%9D%EA%B3%BC-%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98%EC%9D%98-%EC%B1%85%EC%9E%84-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0/</link>
<description><![CDATA[<p>TCP는 정확하고 UDP는 빠르다는 문장만 외우면 실제 애플리케이션을 설명할 때 막히기 쉽습니다. 전송 계층이 어떤 단위를 제공하는지와 서비스가 어떤 완료 조건을 요구하는지를 함께 봐야 하기 때문입니다.</p>
<p>파일을 받는 일, 위치 정보를 갱신하는 일, 요청 처리 완료를 확인하는 일은 서로 다른 질문을 포함합니다. 이 글은 TCP의 바이트 스트림과 UDP의 데이터그램을 중심으로 기본 보장과 애플리케이션의 책임을 정리합니다.</p>
<p>두 프로토콜의 성능을 일률적으로 순위 매기기보다 유실과 지연, 메시지 경계, 처리 확인을 어디서 다루는지 이해하는 데 초점을 둡니다.</p>
<p style="margin:24px 0 8px;"><img src="https://devtechinfo.xyz/data/editor/2609/ai-e4f274324ab3ae8f4ea7.png" alt="TCP와 UDP, 전송 방식과 애플리케이션의 책임 이해하기 관련 설명용 삽화" width="1200" height="1024" style="height:auto;" /></p>
<p style="font-size:14px;color:#64748b;margin:0 0 24px;">AI 생성 삽화 · 개념 이해를 위한 AI 연출 이미지이며 실제 시스템 구성도나 측정 결과가 아닙니다.</p>
<blockquote style="border-left:4px solid #1e3a5f;background:#f1f5f9;padding:16px 20px;margin:24px 0;"><p><strong>핵심 정리</strong><br />TCP는 신뢰성 있는 순서 보장 바이트 스트림을 제공합니다. UDP는 데이터그램을 제공하며 전달 보장이나 재전송을 자체적으로 해결하지 않습니다. 어느 쪽이든 서비스 작업의 완료 조건은 별도로 설계해야 합니다.</p></blockquote>
<hr /><h2 style="color:#1e3a5f;">1. TCP의 순서는 바이트 스트림의 순서입니다</h2>
<p>RFC 9293은 TCP를 애플리케이션에 신뢰성 있고 순서가 보장되는 바이트 스트림 서비스를 제공하는 프로토콜로 설명합니다. 데이터를 보낸 호출 횟수와 받는 호출 횟수가 항상 같다는 뜻은 아닙니다.</p>
<p>설명용으로 송신 측에서 짧은 문장 두 개를 따로 보냈다고 가정해도 수신 측이 언제나 두 번의 읽기로 각각 한 문장을 얻는다고 기대하면 안 됩니다. 애플리케이션은 길이 정보나 구분자 등 자신의 메시지 형식을 정해 스트림에서 경계를 찾아야 합니다.</p>
<p>실제 선택은 사용하는 상위 프로토콜의 규칙에 따릅니다. 처음 네트워크 코드를 읽을 때는 패킷 하나, 읽기 호출 하나, 업무 메시지 하나를 같은 단위로 보지 않는 것이 도움이 됩니다.</p>
<p>TCP가 제공하는 순서와 프로그램이 해석하는 요청 경계를 나누어 설명할 수 있어야 합니다. 이 구분이 없으면 일부만 읽은 내용을 완성된 메시지로 처리하는 실수를 이해하기 어렵습니다.</p>
<p><a href="https://www.rfc-editor.org/rfc/rfc9293.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">2. UDP는 개별 데이터그램을 전달합니다</h2>
<p>UDP는 데이터그램 단위로 데이터를 전달하는 전송 프로토콜입니다. RFC 768은 전달과 중복 방지가 보장되지 않는다는 점을 명시합니다.</p>
<p>애플리케이션은 데이터그램이 유실되거나 예상한 순서와 다르게 도착하는 상황을 고려해야 합니다. 그렇다고 매번 유실된다는 뜻은 아니며 어떤 환경에서 무엇을 관찰했는지와 프로토콜의 보장을 구분해야 합니다.</p>
<p>설명용 위치 갱신 메시지에 번호와 시각을 넣는다면 수신자는 새 정보인지 오래된 정보인지 판단할 자료를 가질 수 있습니다. 이 예시는 실제 서비스의 완성된 프로토콜 설계가 아니라 요구에 따라 상위 계층이 추가 정보를 다룰 수 있다는 설명입니다.</p>
<p>데이터그램 하나가 반드시 하나의 IP 패킷과 같은 것이라고 단정하지도 않습니다. 크기와 경로 조건에 관한 고려가 별도로 필요합니다.</p>
<p>메시지 경계가 있다는 장점만 보고 모든 통신 요구가 해결됐다고 보지는 않는 것이 좋습니다.</p>
<p><a href="https://www.rfc-editor.org/rfc/rfc768.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">3. 전달 확인과 업무 완료를 나눕니다</h2>
<p>전송 계층에서 데이터를 주고받는 일과 상대 애플리케이션이 요청한 업무를 끝내는 일은 다릅니다. 예를 들어 문서 저장 요청의 바이트가 상대에게 도달했다고 해도 서비스가 파일을 검증하고 저장 결과를 확정했다는 의미로 곧바로 읽을 수는 없습니다.</p>
<p>업무 완료를 판단하려면 그 서비스의 응답 규칙과 오류 처리를 확인해야 합니다. 이 예시는 TCP의 기본 전송 보장과 응용 계층의 작업 의미를 구분하기 위한 설명입니다.</p>
<p>클라이언트가 연결 종료만 보고 저장 성공으로 표시한다면 어떤 조건에서 성공으로 간주하는지 검토해야 합니다. 반대로 응답이 늦다는 이유로 같은 요청을 무작정 반복하면 서비스에 따라 중복 처리를 고려해야 할 수도 있습니다.</p>
<p>여기서 중요한 것은 특정 전송 방식을 선택하면 모든 업무 보장이 자동으로 생긴다고 생각하지 않는 것입니다. 요구사항에는 바이트 수신, 요청 해석, 업무 처리, 결과 확인을 별도 단계로 적어 볼 수 있습니다.</p>
<hr /><h2 style="color:#1e3a5f;">4. UDP 위의 설계도 혼잡과 신뢰성을 고려합니다</h2>
<p>UDP 자체에는 TCP와 같은 혼잡 제어 기능이 내장돼 있지 않습니다. RFC 8085는 인터넷에서 UDP를 사용하는 애플리케이션도 적절한 혼잡 대응을 설계해야 한다고 안내합니다.</p>
<p>보내는 쪽에서 빠르게 전송할 수 있다는 사실이 경로 전체가 그 속도를 감당한다는 뜻은 아닙니다. 필요 이상으로 보내는 방식은 유용한 처리량과 지연에 오히려 불리할 수 있습니다.</p>
<p>또한 UDP를 사용한다는 이유로 상위 계층에 신뢰성 기능을 추가할 수 없는 것은 아닙니다. QUIC은 UDP 기반으로 신뢰성 있는 전송 등을 구성하는 별도의 프로토콜 사례입니다.</p>
<p>따라서 UDP 기반 서비스라는 설명을 듣고 재전송도 연결 개념도 전혀 없다고 확대해서 말하지 않습니다. 어느 계층의 프로토콜을 설명하는지 구분해야 합니다.</p>
<p>실제 서비스를 비교할 때는 UDP라는 이름만 보는 대신 그 위에서 사용하는 프로토콜이 제공하는 기능을 읽는 편이 정확합니다.</p>
<p><a href="https://www.rfc-editor.org/rfc/rfc8085.html" rel="nofollow">관련 공식 문서</a></p>
<p><a href="https://www.rfc-editor.org/rfc/rfc9000.html" rel="nofollow">관련 공식 문서</a></p>
<hr /><h2 style="color:#1e3a5f;">5. 선택 기준을 지연과 유실 허용 조건으로 적습니다</h2>
<p>프로토콜을 고르기 전에 어떤 데이터가 늦어져도 필요한지, 오래된 데이터는 버릴 수 있는지, 순서가 업무 의미에 영향을 주는지 질문해 볼 수 있습니다. 설명용 예로 파일의 모든 바이트를 받아야 하는 작업과 매번 최신 위치만 화면에 반영하려는 작업은 완료 조건이 다릅니다.</p>
<p>다만 이 차이만으로 특정 프로토콜을 곧바로 확정하는 것은 성급합니다. 이미 사용하는 상위 프로토콜과 인프라, 구현 복잡도, 보안 요구까지 함께 확인해야 합니다.</p>
<p>학습 단계에서는 요구를 표로 정리하고 각 기능을 어떤 계층에서 처리할지 표시하는 연습이 도움이 됩니다. 지연에 민감하다는 말도 평균 지연인지 드문 큰 지연인지 구체화할 수 있습니다.</p>
<p>데이터 일부가 없어도 된다는 말에는 어느 정도와 어떤 상황인지 조건이 필요합니다. 기술 이름을 먼저 선택한 뒤 요구를 맞추기보다 서비스를 설명하는 문장부터 분명히 하는 편이 좋습니다.</p>
<hr /><h2 style="color:#1e3a5f;">6. 성능 비교는 측정 조건과 완료 기준을 남깁니다</h2>
<p>TCP와 UDP의 속도를 비교했다는 결과를 읽을 때는 전송량과 메시지 크기, 경로 상태, 연결 준비 포함 여부를 살펴봅니다. 송신 프로그램이 데이터를 넘긴 시점만 측정한 결과와 상대가 필요한 데이터를 처리한 시점을 측정한 결과는 같은 의미가 아닙니다.</p>
<p>유실된 데이터가 있는지도 확인하지 않고 높은 송신 속도만 비교하면 서비스 관점의 성능을 놓칠 수 있습니다. 설명용 실험 기록에는 보낸 양, 받은 양, 걸린 시간, 실패 조건을 분리해 적을 수 있습니다.</p>
<p>특정 환경의 숫자를 모든 네트워크에 적용되는 우열로 확대하지 않습니다. 공식 규격은 기본 동작을 이해하는 근거이고 실제 성능은 구체적인 구현과 환경에서 확인할 대상입니다.</p>
<p>면접이나 학습 정리에서도 TCP는 느리다, UDP는 빠르다로 끝내기보다 제공하는 단위와 보장, 상위 계층의 책임을 설명하면 더 정확합니다. 그 뒤에 요구에 맞는 선택과 측정 방법을 논의할 수 있습니다.</p>
<hr /><h2 style="color:#1e3a5f;">7. 자주 묻는 질문</h2>
<h3>Q1. TCP로 두 번 보내면 두 번에 나누어 받나요?</h3>
<p>TCP는 바이트 스트림을 제공하므로 호출 경계를 그대로 보장하지 않습니다. 메시지 경계는 상위 프로토콜의 형식에 맞춰 해석해야 합니다.</p>
<h3>Q2. UDP는 항상 데이터가 유실되나요?</h3>
<p>유실이 반드시 일어난다는 뜻이 아니라 전달을 자체적으로 보장하지 않는다는 뜻입니다. 애플리케이션은 필요한 실패 처리와 순서 판단을 설계합니다.</p>
<h3>Q3. TCP를 쓰면 서버 업무 성공도 보장되나요?</h3>
<p>바이트 전달과 업무 처리 완료는 다른 단계입니다. 서비스의 응답 규칙과 오류 조건을 별도로 확인해야 합니다.</p>
<h3>Q4. UDP 기반이면 신뢰성 기능을 만들 수 없나요?</h3>
<p>상위 프로토콜이 필요한 기능을 추가할 수 있습니다. QUIC처럼 UDP 기반으로 별도 전송 기능을 구성하는 사례가 있습니다.</p>
<hr /><h2 style="color:#1e3a5f;">참고 자료</h2><ul><li><a href="https://www.rfc-editor.org/rfc/rfc9293.html" rel="nofollow">IETF RFC 9293: TCP</a></li><li><a href="https://www.rfc-editor.org/rfc/rfc768.html" rel="nofollow">IETF RFC 768: UDP</a></li><li><a href="https://www.rfc-editor.org/rfc/rfc8085.html" rel="nofollow">IETF RFC 8085: UDP 사용 지침</a></li><li><a href="https://www.rfc-editor.org/rfc/rfc9000.html" rel="nofollow">IETF RFC 9000: QUIC</a></li></ul>]]></description>
<dc:creator>관리자</dc:creator>
<dc:date>2026-09-29T07:48:12+09:00</dc:date>
</item>

</channel>
</rss>
