오늘을 도전 과제인 Netfilx리뷰 파일 모델학습 까지 도전해 보았다.
나는 발표와 발표자료 만들기 담당이지만
내가 한번 해보아야 팀원들이 어떤 말을 하는지 알 수 있을거같다는 생각에 진행해 보았다.
순서는
1. 데이터 셋 불러오기
2. 데이터 전처리
3. feature 분석
4. 리뷰 예측 모델 학습시키기(LSTM)
5. 회고(모델학습 / git사용)
으로 소개를 진행하겟습니다.
☑️ 데이터 셋 불러오기
링크에서 데이터셋을 다운로드한 후에 데이터셋을 불러오고, 불러온 데이터프레임의 상단 5개의 데이터와 하단 5개의 데이터, 컬럼과 shape를 불러오는 코드를 작성해주세요.
import pandas as pd
import numpy as np
df = pd.read_csv("netflix_reviews.csv")
df_sh = data.shape
df_index = data.columns
print(f"Shape of the dataset {df_sh}")
print(f"Columns in the dataset: {df_index}")
df.head()
df.head(-1)
이제 f-string을 사용하는 방법은 버벅이지도 않고 바로 생각할 수 있게 되었다.
☑️ 데이터 전처리
텍스트 데이터에는 불용어(쓸모없는 단어, 구두점 등)가 많습니다. 해당 부분을 없애주는 처리가 필요합니다. 텍스트 데이터에 대한 전처리를 해주세요.
import re
def preprocess_text(text):
if isinstance(text, float):
return ""
text = text.lower()
text = re.sub(r'[^\w\s]', '', text)
text = re.sub(r'\d+', '', text)
text = text.strip()
return text
df['content'] = df['content'].apply(lambda x: preprocess_text(x))
위 코드를 이용하여 content열의 문자를 소문자로, 구두점 제거, 띄어쓰기 제외 빈칸 제거를 시키는 함수를 정의 하였고
content열에만 적용 시켰다.
☑️ feature 분석
데이터를 잘 불러오셨다면 해당 데이터의 feature를 찾아야 합니다. 해당 넷플릭스의 데이터에는 리뷰가 1점부터 5점까지 있습니다. 해당 데이터의 분포를 그래프로 그려주세요.
import seaborn as sns # 시각화 라이브러리
import matplotlib.pyplot as plt # 그래프 표시 라이브러리
# 리뷰 점수 빈도 계산
score_counts = df['score'].value_counts()
# 그래프 만들기
plt.figure(figsize=(10, 7))
# 색상 넣기는 강의 자료에서 찾았습니다. palette = 'viridis'
# X축에 점수, Y축에 해당 점수의 개수
sns.barplot(x=score_counts.index, y=score_counts.values, palette='viridis')
plt.xlabel('Score') # X축 레이블
plt.ylabel('Count') # Y축 레이블
plt.title('Distribution of Review Scores') # 그래프 제목
plt.show()
위 코드를 작성하여 점수별 분포를 막대 그래프로 표현 하였다.
☑️ 리뷰 예측 모델 학습시키기(LSTM)
이제 어떤 리뷰를 쓰면 점수가 어떻게 나올지에 대해서 예측을 해보고 싶습니다. 로지스틱 회귀 등을 사용하여, 리뷰에 대한 점수 예측을 진행해보세요
import torch
import torch.nn as nn
import torch.optim as optim
from torchtext.data.utils import get_tokenizer
from torchtext.vocab import build_vocab_from_iterator
from torch.utils.data import DataLoader, Dataset
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
reviews = df['content'].fillna('') # 리뷰가 없는 경우 공백으로 대체
ratings = df['score']
# 토크나이저 및 어휘 집합 생성
tokenizer = get_tokenizer("basic_english")
def yield_tokens(df_iter):
for text in df_iter:
yield tokenizer(text)
vocab = build_vocab_from_iterator(yield_tokens(train_reviews), specials=["<unk>"])
vocab.set_default_index(vocab["<unk>"])
# 텍스트 파이프라인: 텍스트 -> 토큰 -> 인덱스
def text_pipeline(x):
return [vocab[token] for token in tokenizer(x)]
# 레이블 파이프라인: 점수(1-5)를 0부터 시작하는 인덱스로 변환
label_encoder = LabelEncoder()
train_ratings_encoded = label_encoder.fit_transform(train_ratings)
test_ratings_encoded = label_encoder.transform(test_ratings)
class ReviewDataset(df):
# 초기화 메서드
def __init__(self, reviews, ratings, text_pipeline, lable_pipeline):
# 각 데이터를 변수로 저장
self.reviews = reviews
self.ratings = ratings
self.text_pipeline = text_pipeline
self.label_pipeline = label_pipeline
# 데이터 셋의 크기 반환
def __len__(self):
return len(self.reviews)
# 인덱스를 사용해 특정 데이터 항목 가져오기
def __getitem__(self, idx):
review = self.text_pipeline(self.reviews[idx])
rating = self.label_pipeline(self.ratings[idx])
# 리뷰와 점수 텐서로 변환
return torch.tensor(review), torch.tensor(rating)
# 데이터 셋 정의
train_dataset = ReviewDataset(train_reviews, train_ratings, text_pipeline, label_pipeline)
test_dataset = ReviewDataset(test_reviews, test_ratings, text_pipeline, label_pipeline)
# 데이터 로더 정의
BATCH_SIZE = 64
# LSTM모델 정의
class LSTMModel(nn.Module):
def __init__(self, vocab_size, embed_dim, hidden_dim, output_dim):
# super()은 부모 클래스의 메서드나 속성을 호출
# nn.Module의 초기화 메서드를 호출해 초기화 수행
super(LSTMModel, self).__init__()
# 임베딩을 진행하는 이유: 단어를 고차원 공간에서의 실수 벡터로 변환
# 모델이 텍스트의 의미를 이해하게 만든다.
# sparse=True는 희소 인베딩을 활성화 한다.
# 임베딩 레이어가 메모리 효율적으로 작동하게 만들며, 단어 인덱스 만을 사용하게 만든다.
self.embedding = nn.EmbeddingBag(vocab_size, embed_dim, sparse=True)
# LSTM 정의
# 시퀀스 데이터를 처리 역할
# LSTM은 장기 의존성 학습으로 문맥의 정보를 잘 기억
# 텍스트 시퀀스는 시간적으로 의존성을 가지므로 LSTM을 통해 정보를 효과적으로 학습
# batch_first=True는 입력텐서의 첫 번째 차원이 배치 크기로 만든다.
self.lstm = nn.LSTM(embed_dim, hidden_dim, batch_first=True)
self.fc = nn.Linear(hidden_dim, output_dim)
# 모델의 순전파 정의
# text는 모델에 입력 되는 텍스트 데이터
# 순전파란? 입력 데이터가 모델을 통해 전달되어 최종 출력이 생성 되는 과정 의미
# 출력 레이어에서 예측값이 생성된다.
def forward(self, text):
embedded = self.embedding(text)
# unsqueeze(0)는 입력 텐서에 배치차원을 추가하는 방법
# 왜 추가하는지? LSTM은 일반적으로 (배치 크기, 시퀀스 길이, 특성 수)의 형태를 가진 텐서를 입력받는데
# embedded 텐서가 (시퀀스 길이, 특성 수)의 형태일 경우, unsqueeze(0)을 사용하여 (1, 시퀀스 길이, 특성 수)의 형태로 변환해 LSTM에 맞춘다.
output, (hidden, cell) = self.lstm(embedded.unsqueeze(0))
# hidden[-1]은 모든 숨겨진 상태의 텐서에서 마지막에 숨겨진 상태를 의미
return self.fc(hidden[-1])
위 코드는 완성이 된것이 아니다.
작성해나가며 새롭게 알게 된 정보들을 정리하고 적용해나가다가
너무 어렵고 감이 잡히지않아 멈추게 되었다 (공부를 마치는 시간은 이미 지나 버림)
위 코드 설명은 생략하겟다.(지금 머리가 너무 볶잡해서..)
☑️ 회고
오늘 공부하면 만난 정보와 오류나 궁금증들을 공유해보고자 한다.
데이터 셋 불러오기
1. 처음부분 마지막부분 5개씩 가져오기
2가지 방벙이 있다는 것을 확인했다
df.head
------------------------
df.head()
df.head(-1)
이 두가지 방법 중에서 가독성이 두번 째 방법이 더 좋은 것으로 보인다.
데이터 전처리
1. 사용자 지정 함수 (def)를 데이터 프레임에 적용 시키는 방법을 모르겟음
apply와 lambda함수를 사용하여 적용(lambda 함수의 활용법을 더 알아봐야할듯)
lambda는 임의의 함수, 맵핑 등에 사용 가능함(지금 알고있는 방식이 2가지)
2. 텍스트의 불필요한 부분만 제거하는 re의 표현식
. : 임의의 한 문자 (줄바꿈 문자는 제외)
\w : 알파벳 문자, 숫자, 언더스코어 ([a-zA-Z0-9_])
\W : 문자, 숫자, 언더스코어가 아닌 모든 것
\d : 숫자 ([0-9])
\D : 숫자가 아닌 것
\s : 공백 문자 (스페이스, 탭, 줄바꿈)
\S : 공백이 아닌 문자
w랑 s는 묶어서 사용했는데 왜 d+는 따로 사용했는지
* : 0번 이상 반복
+ : 1번 이상 반복
? : 0번 또는 1번
{n} : 정확히 n번 반복
{n,} : n번 이상 반복
{n,m} : 최소 n번, 최대 m번 반복
^ : 문자열의 시작
$ : 문자열의 끝
\b : 단어의 경계
\B : 단어 경계가 아님
feature 분석
1. 수치형 데이터의 값마다 수를 세는 방법
Score_count = df['score'].value_counts()
사용할수있는 모든 count방법을 다 사용해보았음
2. 그래프의 x,y열에 값을 넣고 인덱스를 넣는 방법
sns.barplot(x=score_counts.index, y=score_counts.values, palette='viridis')
저기 위치에 아무것도 안 넣기, keys/values넣기, keys/value하나씩 넣어보기 하다가 튜터님에게 질문하여 알게 되었다.
☑️ GIT
git
git rm --cached "레포 파일 삭제" => commit => push해야지 레포에 적용 됨
git rm 삭제할 파일 "파일 자체 삭제"
git config --global core.autocrlf true"윈도우 줄바꿈 자동변환"
git config --global core.autocrlf false"자동변환 비활성화"
vim에서 탈출 방법
esc누르고 :wq
git 공동 작업 환경
git branch -a 브랜치 이름 학인
git checkout branch-name 특정 브랜치로 이동
git pull origin branch-name 최신파일 가져오기
충돌이 발생했을 때
vim example_file.txt
nano example_file.txt
code example_file.txt
3개중에 1개로 파일을 열어서 내리다보면 <<<<<<<======>>>>>>으로
표시된 구간에서 이전/지금/ 합쳐서 저장할지 마우스로 클릭하고 저장한 뒤
다시 git add부터 시작하면 된다.
'TIL' 카테고리의 다른 글
내일배움캠프 22일차 TIL + 기초 수학 특강, 과제준비 (1) | 2024.10.28 |
---|---|
내일배움캠프 21일차 TIL + 문제은행, 기초수학 특강 (1) | 2024.10.25 |
내일배움캠프 19일차 TIL + 타이타닉 데이터 셋 생존자 예측 모델 (0) | 2024.10.23 |
내일배움캠프 18일차 TIL + 노션, GITHUB, 머신러닝 코드 분석 (2) | 2024.10.22 |
내일배움캠프 17일 차 TIL + 머신러닝 코드 (4) | 2024.10.21 |