Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

8 P2 프로젝트: 뉴스그룹 주제 분류

Updated: 04 okt 2026

P2 실습에서는 Reuters 뉴스 기사를 이용하여 여러 클래스 중 하나를 예측하는 다중 클래스 분류를 다루었다.

이번 프로젝트에서는 새로운 텍스트 데이터인 20 Newsgroups를 이용하여 게시글의 주제를 분류한다.

프로젝트의 핵심은 Reuters 코드를 그대로 반복하는 것이 아니라,

새로운 다중 클래스 분류 문제에서 출력층·손실함수·평가지표를 선택하고, 일반화 성능과 오류를 판단하는 것

이다.

8.1프로젝트에서 해야 할 일

  1. 20개의 뉴스그룹 클래스와 데이터의 의미를 확인한다.

  2. 제공된 텍스트 벡터화 결과를 확인한다.

  3. 다중 클래스 분류에 적절한 모델을 설계한다.

  4. Keras와 PyTorch에서 모두 기준 모델을 구성하고 훈련한다.

  5. accuracy와 Top-3 accuracy를 함께 확인한다.

  6. 두 프레임워크에서 과대적합 여부와 일반화 성능을 비교한다.

  7. 각 프레임워크에서 일반화 성능을 개선하기 위한 방법을 하나 이상 적용한다.

  8. Keras와 PyTorch의 최종 모델을 각각 테스트 데이터에서 평가한다.

  9. 어떤 클래스들이 서로 혼동되는지 분석한다.

8.2생성형 AI 활용

생성형 AI는 코드 작성·수정, 오류 메시지 해석, Keras와 PyTorch 코드 변환, 그래프 작성, 모델 개선 방법이나 오류 분석 아이디어 제안 등에 활용할 수 있다.

하지만 다음은 직접 확인하고 판단해야 한다.

  • 출력 유닛 수는 몇 개여야 하는가?

  • 어떤 손실함수와 평가지표가 적절한가?

  • accuracy와 Top-3 accuracy는 무엇을 다르게 보여주는가?

  • Keras와 PyTorch에서 같은 다중 클래스 분류 문제를 어떻게 표현하는가?

  • 모델 크기는 적절한가?

  • 과대적합이 나타나는가?

  • 두 프레임워크의 결과를 어떻게 비교할 것인가?

  • 어떤 클래스들이 왜 서로 혼동되는가?

프로젝트 마지막에 AI를 어디에 활용했고 무엇을 직접 검증했는지 기록한다.


8.3실행 환경 확인


8.420 Newsgroups 데이터

20 Newsgroups는 게시글을 20개의 주제 중 하나로 분류하는 데이터셋이다.

Reuters와 마찬가지로 여러 클래스 중 하나를 예측하지만, 이번에는 다른 텍스트 데이터에서 같은 원리를 적용한다.

원시 텍스트의 복잡한 전처리가 프로젝트의 중심이 되지 않도록 데이터 불러오기와 기본 벡터화 코드는 제공한다.

8.4.1클래스 확인

8.4.2게시글 하나 확인

8.4.3문제 1 — Reuters와 무엇이 같고 다른가?

  1. 이 문제는 왜 다중 클래스 분류인가?

  2. 한 게시글은 여러 주제에 동시에 속하는가, 하나의 주제에 속하는가?

  3. 출력층의 유닛 수는 몇 개가 되어야 하는가?

  4. Reuters 문제와 공통점과 차이점을 설명하라.

답:

여기에 작성한다.


8.5훈련셋과 검증셋 분리

원래의 테스트 데이터는 최종 평가에만 사용한다.

훈련 데이터의 일부를 검증셋으로 분리하여 모델 구조와 일반화 성능을 판단한다.

클래스 비율이 크게 달라지지 않도록 stratify를 사용한다.


8.6텍스트 벡터화

신경망의 Dense 층은 문자열을 직접 입력으로 사용할 수 없다. 따라서 게시글을 고정 길이의 수치 벡터로 변환한다.

이번 프로젝트에서는 TF-IDF 벡터화를 제공한다.

프로젝트의 초점은 벡터화 방법 자체보다 다중 클래스 모델을 설계하고 평가하는 것이다.

중요한 점은 벡터화 기준도 훈련 데이터에서만 학습해야 한다는 것이다.

8.6.1벡터화 확인

  1. 한 게시글이 몇 개의 입력값으로 표현되는가?

  2. 모든 게시글의 원래 길이가 다른데도 Dense 층에 넣을 수 있는 이유는 무엇인가?

  3. fit_transform()은 훈련 텍스트에만 사용하고 검증·테스트에는 transform()만 사용하는 이유는 무엇인가?

답:

여기에 작성한다.


8.7모델링

이번 프로젝트에서는 Keras와 PyTorch를 모두 사용한다.

Reuters 실습의 모델은 좋은 출발점이지만, 이번에는 입력 차원과 클래스 수가 다르다.

가능하면 두 프레임워크에서 비슷한 은닉층 구조를 사용하여 같은 다중 클래스 분류 원리가 어떻게 표현되는지 비교한다.

다음 사항을 직접 결정한다.

  • 은닉층 수

  • 각 은닉층의 유닛 수

  • Dropout 또는 L2 규제 사용 여부

  • batch size

  • 최대 epoch

  • 조기 종료 사용 여부

8.7.1공통 모델 설계 원칙

Keras와 PyTorch에서 가능한 한 비슷한 구조를 사용한다.

  • 은닉층 수:

  • 각 은닉층의 유닛 수:

  • 클래스 수:

  • 출력층 유닛 수:

  • 손실함수:

  • 기본 평가지표:

  • 추가 Top-k 지표:

  • batch size:

  • 최대 epoch:

이 구조를 선택한 이유:

여기에 작성한다.

8.7.2Keras와 PyTorch에서 출력이 다른 점

같은 다중 클래스 분류 문제라도 구현 방식에는 차이가 있다.

  • Keras에서는 보통 마지막 층에 softmax를 두어 확률 분포를 출력한다.

  • PyTorch에서는 보통 마지막 층에서 logits를 출력하고 CrossEntropyLoss()가 필요한 계산을 내부적으로 처리한다.

따라서 두 모델의 마지막 코드 모양은 다르지만 20개 클래스 중 하나를 예측한다는 문제 자체는 동일하다.

두 구현이 어떻게 대응되는지 프로젝트를 진행하면서 확인한다.


8.8Keras 모델

먼저 Keras에서 기준 모델과 개선 모델을 구성하고 훈련한다.

8.8.1Keras 기준 모델

8.8.2Keras 개선 모델

기준 모델의 훈련·검증 결과를 확인한 뒤 다음 방법 중 하나 이상을 적용한다.

  • 은닉층 크기 변경

  • L2 가중치 규제

  • Dropout

  • EarlyStopping

변경 내용과 이유:

여기에 작성한다.


8.9PyTorch 모델

같은 다중 클래스 분류 문제를 PyTorch에서도 구현한다. 가능하면 Keras 모델과 비슷한 은닉층 구조를 사용한다.

8.9.1PyTorch 훈련 함수

PyTorch에서는 모델이 logits를 출력하고 CrossEntropyLoss()가 softmax에 해당하는 계산을 내부적으로 처리한다.

프로젝트의 중심이 반복문 작성이 되지 않도록 기본 훈련 함수를 제공한다.

8.9.2PyTorch 기준 모델

8.9.3PyTorch 개선 모델

변경 내용과 이유:

여기에 작성한다.


8.10훈련 과정 확인

기준 모델과 개선 모델의 훈련·검증 결과를 비교한다.

특히 다음 세 가지를 함께 살펴본다.

  • loss

  • accuracy

  • Top-3 accuracy

8.10.1결과 비교와 모델 선택

다음 질문에 답한다.

  1. Keras에서 훈련 loss와 검증 loss는 어떻게 변화했는가?

  2. PyTorch에서 훈련 loss와 검증 loss는 어떻게 변화했는가?

  3. 각 프레임워크에서 과대적합이 나타났는가?

  4. 기준 모델과 개선 모델의 검증 accuracy는 어떻게 달라졌는가?

  5. Top-3 accuracy는 일반 accuracy보다 왜 높은가?

  6. Keras와 PyTorch의 검증 accuracy와 Top-3 accuracy는 얼마나 비슷하거나 달랐는가?

  7. 같은 구조를 사용했는데도 결과가 다르다면 가능한 이유는 무엇인가?

  8. 각 프레임워크에서 최종 모델로 어떤 모델을 선택하겠는가?

답:

여기에 비교와 판단을 작성한다.


8.11최종 테스트 평가

모델 비교가 끝난 뒤 Keras와 PyTorch에서 선택한 최종 모델을 각각 테스트 데이터에서 한 번 평가한다.


8.12예측 결과와 오류 분석

전체 accuracy만으로는 어떤 주제들이 서로 혼동되는지 알 수 없다.

최종 모델의 예측 클래스 번호를 만들고, 혼동행렬과 오분류 사례를 확인한다.

8.12.1혼동되는 클래스 찾기

혼동행렬에서 대각선은 올바르게 분류한 샘플이고, 대각선 밖의 값은 다른 클래스로 잘못 분류한 샘플이다.

다음 질문에 답하라.

  1. 가장 많이 혼동되는 클래스 조합은 무엇인가?

  2. 두 클래스의 주제가 서로 비슷한가?

  3. Top-3 예측을 함께 보면 오분류 사례를 다르게 해석할 수 있는가?

  4. 단순 accuracy만 확인했을 때 알 수 없었던 모델의 특성은 무엇인가?

답:

여기에 분석을 작성한다.

8.12.2오분류 게시글 직접 확인

오분류된 게시글 몇 개를 직접 읽어보고 정답 주제와 모델의 예측 주제를 비교한다.


8.13프로젝트 최종 정리

8.13.1문제와 데이터

무엇을 예측했고 클래스는 몇 개인가?

8.13.2입력 표현

텍스트를 어떤 형태의 입력 벡터로 사용했는가?

8.13.3모델 설계

출력층, 손실함수, 평가지표를 어떻게 결정했는가?

8.13.4일반화

과대적합이 있었는가? 어떤 방법으로 대응했는가?

8.13.5Accuracy와 Top-3 accuracy

두 지표는 각각 무엇을 보여주었는가?

8.13.6최종 결과

테스트 accuracy와 Top-3 accuracy는 얼마인가?

8.13.7오류와 한계

어떤 클래스들이 서로 혼동되었고 그 이유는 무엇이라고 판단하는가?

8.13.8생성형 AI 활용과 검증

AI를 어디에 활용했고, 어떤 결과를 직접 확인·검증했는가?

8.14제출 전 확인

  • 다중 클래스 분류 문제와 타깃의 의미를 설명했다.

  • 20개 클래스의 의미를 확인했다.

  • 텍스트 벡터화의 역할을 설명했다.

  • 출력층과 손실함수·평가지표의 선택 이유를 설명했다.

  • Keras 기준 모델과 개선 모델을 모두 훈련했다.

  • PyTorch 기준 모델과 개선 모델을 모두 훈련했다.

  • 두 프레임워크에서 훈련 성능과 검증 성능을 비교했다.

  • accuracy와 Top-3 accuracy를 함께 해석했다.

  • Keras와 PyTorch의 구현 방식과 결과를 비교했다.

  • 각 프레임워크의 최종 모델을 선택하고 근거를 설명했다.

  • 테스트셋은 각 최종 모델의 마지막 평가에만 사용했다.

  • 두 프레임워크의 혼동행렬과 오분류 사례를 분석했다.

  • 생성형 AI 활용 내용과 검증 방법을 기록했다.