본문 바로가기

Python/Machine Learning

Machine Learning : 문자열 데이터를 숫자로 바꿔주는 CountVectorizer와 analyzer파라미터

문자열 데이터를 숫자로 바꿔주는 CountVectorizer와 analyzer파라미터

analyzer 파라미터는 학습단위를 결정하는 파라미터입니다.
word, char 2가지 옵션 정도를 고려해볼 수 있습니다.

analyzer = 'word'라고 설정시, 학습의 단위를 단어로 설정합니다. (ex - home, go, my ...)
analyzer = 'char'라고 설정시, 학습의 단위를 글자로 설정합니다.(ex - a, b, c, d ...)

 

 

나이브 베이즈를 이용한 스팸 분류
PROBLEM STATEMENT
5,574개의 이메일 메시지가 있으며, 스팸인지 아닌지의 정보를 가지고 있다.
컬럼 : text, spam
spam 컬럼의 값이 1이면 스팸이고, 0이면 스팸이 아닙니다.
스팸인지 아닌지 분류하는 인공지능을 만들자 - 수퍼바이즈드 러닝의 분류 문제!

 

 

STEP #0: LIBRARIES IMPORT

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

 

STEP #1: IMPORT DATASET

emails.csv 읽기

in

from google.colab import drive
drive.mount('/content/drive')

 

 

out

Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount("/content/drive", force_remount=True).

 

 

구글 드라이브에 호환하는 방법

import os
os.chdir('/content/drive/MyDrive/Colab Notebooks')
pd.read_csv('emails.csv')

 

spam_df =  pd.read_csv('emails.csv')
spam_df.head()

 

 


STEP #2: VISUALIZE DATASET

스팸은 몇개이고, 아닌것은 몇개인지 확인하시오.

spam_df.head(3)

spam_df.shape
#####out
(5728, 2)

sns.countplot(data= spam_df, x = 'spam')
plt.show()

in

spam_df['spam'].value_counts()

 

 

out

0    4360
1    1368
Name: spam, dtype: int64

이메일의 길이가 스팸과 관련이 있는지 확인해 보려 합니다. 이메일의 문자 길이를 구해서, length 라는 컬럼을 만드세요.

spam_df['text'][0]
spam_df['spam'][0]

########out
1

spam_df['length'] = spam_df['text'].str.len()
spam_df.head(3)

 

out

 

 


글자 길이를 히스토그램으로 나타내시오.

spam_df['length'].hist()
plt.show()

in

spam_df.corr()

 

out

 


가장 긴 이메일을 찾아서 스팸인지 아닌지 확인하고, 이메일 내용을 확인하시오.

in

spam_df.loc[ spam_df['length'] == spam_df['length'].max() ,  ]

 

 

out

2650	Subject: from the enron india newsdesk - april...	0	43952

 

spam_df.loc[ spam_df['length'] == spam_df['length'].max() , 'text' ][2650]

#########out
Subject: from the enron india newsdesk - april 27 th newsclips  fyi news articles from indian press .  - - - - - - - - - - - - - - - - - - - - - - forwarded by sandeep kohli / enron _ development on 04 / 27 / 2001 08 : 24 am - - - - - - - - - - - - - - - - - - - - - - - - - - -  nikita varma  04 / 27 / 2001 07 : 51 am  to : nikita varma / enron _ development @ enron _ development  cc : ( bcc : sandeep kohli / enron _ development )  subject : from the enron india newsdesk - april 27 th newsclips  friday apr 27 2001 , http : / / www . economictimes . com / today / cmo 3 . htm  dpc board empowers md to cancel mseb contract  friday apr 27 2001 , http : / / www . economictimes . com / today / 27 compl 1 . htm  mseb pays rs 134 cr under \' protest \' to dpc  friday , april 27 , 001 , http : / / www . businessstandard . com / today / economy 4 . asp ? menu = 3  enron india md authorised to terminate ppa  friday , april 27 , 2001 , http : / / www . financialexpress . com / fe 20010427 / topl .

0은 스팸이 아니고, 1은 스팸입니다. 파이차트를 통해, 스팸과 스팸이 아닌것이 몇 퍼센트인지, 소수점 1자리 까지만 보여주세요.

 

spam_count = spam_df['spam'].value_counts()
spam_count

#####out
0    4360
1    1368
Name: spam, dtype: int64

plt.pie(spam_count, autopct='%.1f', labels = spam_count.index)
plt.show()

 

 

 

out


스팸이 아닌것은 ham 변수로, 스팸인것은 spam 변수로 저장하시오.

ham = spam_df.loc[ spam_df['spam'] == 0  ,  ]   
spam = spam_df.loc[ spam_df['spam'] == 1  ,  ]  

# 스팸의 이메일 길이를 히스토그램으로 나타내시오.
spam['length'].hist()
plt.show()

 

 

out

 
 
 
# 햄의 이메일 길이를 히스토그램으로 나타내시오.
 
ham['length'].hist()
plt.show()


STEP #3: CREATE TESTING AND TRAINING DATASET/DATA CLEANING

STEP 3.1 쉼표, 마침표 등의 구두점 제거하기

 

spam_df

Test = 'Hello Mr. Future, I am so happy to be learning AI now~'
import string
string.punctuation