Cloning into 'Mecab-ko-for-Google-Colab'...
remote: Enumerating objects: 91, done.[K
remote: Total 91 (delta 0), reused 0 (delta 0), pack-reused 91[K
Unpacking objects: 100% (91/91), done.
/content/Mecab-ko-for-Google-Colab
Installing konlpy.....
Collecting konlpy
Downloading konlpy-0.5.2-py2.py3-none-any.whl (19.4 MB)
[K |████████████████████████████████| 19.4 MB 2.4 MB/s
[?25hCollecting JPype1>=0.7.0
Downloading JPype1-1.3.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl (448 kB)
[K |████████████████████████████████| 448 kB 23.5 MB/s
[?25hRequirement already satisfied: lxml>=4.1.0 in /usr/local/lib/python3.7/dist-packages (from konlpy) (4.2.6)
Collecting colorama
Downloading colorama-0.4.4-py2.py3-none-any.whl (16 kB)
Requirement already satisfied: tweepy>=3.7.0 in /usr/local/lib/python3.7/dist-packages (from konlpy) (3.10.0)
Requirement already satisfied: numpy>=1.6 in /usr/local/lib/python3.7/dist-packages (from konlpy) (1.19.5)
Collecting beautifulsoup4==4.6.0
Downloading beautifulsoup4-4.6.0-py3-none-any.whl (86 kB)
[K |████████████████████████████████| 86 kB 2.4 MB/s
[?25hRequirement already satisfied: typing-extensions in /usr/local/lib/python3.7/dist-packages (from JPype1>=0.7.0->konlpy) (3.10.0.2)
Requirement already satisfied: requests-oauthlib>=0.7.0 in /usr/local/lib/python3.7/dist-packages (from tweepy>=3.7.0->konlpy) (1.3.0)
Requirement already satisfied: requests[socks]>=2.11.1 in /usr/local/lib/python3.7/dist-packages (from tweepy>=3.7.0->konlpy) (2.23.0)
Requirement already satisfied: six>=1.10.0 in /usr/local/lib/python3.7/dist-packages (from tweepy>=3.7.0->konlpy) (1.15.0)
Requirement already satisfied: oauthlib>=3.0.0 in /usr/local/lib/python3.7/dist-packages (from requests-oauthlib>=0.7.0->tweepy>=3.7.0->konlpy) (3.1.1)
Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests[socks]>=2.11.1->tweepy>=3.7.0->konlpy) (1.24.3)
Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests[socks]>=2.11.1->tweepy>=3.7.0->konlpy) (3.0.4)
Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests[socks]>=2.11.1->tweepy>=3.7.0->konlpy) (2021.10.8)
Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests[socks]>=2.11.1->tweepy>=3.7.0->konlpy) (2.10)
Requirement already satisfied: PySocks!=1.5.7,>=1.5.6 in /usr/local/lib/python3.7/dist-packages (from requests[socks]>=2.11.1->tweepy>=3.7.0->konlpy) (1.7.1)
Installing collected packages: JPype1, colorama, beautifulsoup4, konlpy
Attempting uninstall: beautifulsoup4
Found existing installation: beautifulsoup4 4.6.3
Uninstalling beautifulsoup4-4.6.3:
Successfully uninstalled beautifulsoup4-4.6.3
Successfully installed JPype1-1.3.0 beautifulsoup4-4.6.0 colorama-0.4.4 konlpy-0.5.2
Done
Installing mecab-0.996-ko-0.9.2.tar.gz.....
Downloading mecab-0.996-ko-0.9.2.tar.gz.......
from https://bitbucket.org/eunjeon/mecab-ko/downloads/mecab-0.996-ko-0.9.2.tar.gz
--2021-12-15 08:19:45-- https://bitbucket.org/eunjeon/mecab-ko/downloads/mecab-0.996-ko-0.9.2.tar.gz
Resolving bitbucket.org (bitbucket.org)... 104.192.141.1, 2406:da00:ff00::22c0:3470, 2406:da00:ff00::22e9:9f55, ...
Connecting to bitbucket.org (bitbucket.org)|104.192.141.1|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://bbuseruploads.s3.amazonaws.com/eunjeon/mecab-ko/downloads/mecab-0.996-ko-0.9.2.tar.gz?Signature=Djk%2BX4VYfoZUGHzDRgTrcVVdFvE%3D&Expires=1639557778&AWSAccessKeyId=AKIA6KOSE3BNJRRFUUX6&versionId=null&response-content-disposition=attachment%3B%20filename%3D%22mecab-0.996-ko-0.9.2.tar.gz%22&response-content-encoding=None [following]
--2021-12-15 08:19:46-- https://bbuseruploads.s3.amazonaws.com/eunjeon/mecab-ko/downloads/mecab-0.996-ko-0.9.2.tar.gz?Signature=Djk%2BX4VYfoZUGHzDRgTrcVVdFvE%3D&Expires=1639557778&AWSAccessKeyId=AKIA6KOSE3BNJRRFUUX6&versionId=null&response-content-disposition=attachment%3B%20filename%3D%22mecab-0.996-ko-0.9.2.tar.gz%22&response-content-encoding=None
Resolving bbuseruploads.s3.amazonaws.com (bbuseruploads.s3.amazonaws.com)... 52.216.113.163
Connecting to bbuseruploads.s3.amazonaws.com (bbuseruploads.s3.amazonaws.com)|52.216.113.163|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1414979 (1.3M) [application/x-tar]
Saving to: ‘mecab-0.996-ko-0.9.2.tar.gz’
mecab-0.996-ko-0.9. 100%[===================>] 1.35M 1.07MB/s in 1.3s
2021-12-15 08:19:48 (1.07 MB/s) - ‘mecab-0.996-ko-0.9.2.tar.gz’ saved [1414979/1414979]
Done
Unpacking mecab-0.996-ko-0.9.2.tar.gz.......
Done
Change Directory to mecab-0.996-ko-0.9.2.......
installing mecab-0.996-ko-0.9.2.tar.gz........
configure
make
make check
make install
ldconfig
Done
Change Directory to /content
Downloading mecab-ko-dic-2.1.1-20180720.tar.gz.......
from https://bitbucket.org/eunjeon/mecab-ko-dic/downloads/mecab-ko-dic-2.1.1-20180720.tar.gz
--2021-12-15 08:21:19-- https://bitbucket.org/eunjeon/mecab-ko-dic/downloads/mecab-ko-dic-2.1.1-20180720.tar.gz
Resolving bitbucket.org (bitbucket.org)... 104.192.141.1, 2406:da00:ff00::6b17:d1f5, 2406:da00:ff00::22cd:e0db, ...
Connecting to bitbucket.org (bitbucket.org)|104.192.141.1|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://bbuseruploads.s3.amazonaws.com/a4fcd83e-34f1-454e-a6ac-c242c7d434d3/downloads/b5a0c703-7b64-45ed-a2d7-180e962710b6/mecab-ko-dic-2.1.1-20180720.tar.gz?Signature=ZNAR2x6%2FNWxJ4p%2BOkG%2BjdG77Dqk%3D&Expires=1639558279&AWSAccessKeyId=AKIA6KOSE3BNJRRFUUX6&versionId=tzyxc1TtnZU_zEuaaQDGN4F76hPDpyFq&response-content-disposition=attachment%3B%20filename%3D%22mecab-ko-dic-2.1.1-20180720.tar.gz%22&response-content-encoding=None [following]
--2021-12-15 08:21:19-- https://bbuseruploads.s3.amazonaws.com/a4fcd83e-34f1-454e-a6ac-c242c7d434d3/downloads/b5a0c703-7b64-45ed-a2d7-180e962710b6/mecab-ko-dic-2.1.1-20180720.tar.gz?Signature=ZNAR2x6%2FNWxJ4p%2BOkG%2BjdG77Dqk%3D&Expires=1639558279&AWSAccessKeyId=AKIA6KOSE3BNJRRFUUX6&versionId=tzyxc1TtnZU_zEuaaQDGN4F76hPDpyFq&response-content-disposition=attachment%3B%20filename%3D%22mecab-ko-dic-2.1.1-20180720.tar.gz%22&response-content-encoding=None
Resolving bbuseruploads.s3.amazonaws.com (bbuseruploads.s3.amazonaws.com)... 54.231.82.195
Connecting to bbuseruploads.s3.amazonaws.com (bbuseruploads.s3.amazonaws.com)|54.231.82.195|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 49775061 (47M) [application/x-tar]
Saving to: ‘mecab-ko-dic-2.1.1-20180720.tar.gz’
mecab-ko-dic-2.1.1- 100%[===================>] 47.47M 13.0MB/s in 4.5s
2021-12-15 08:21:25 (10.5 MB/s) - ‘mecab-ko-dic-2.1.1-20180720.tar.gz’ saved [49775061/49775061]
Done
Unpacking mecab-ko-dic-2.1.1-20180720.tar.gz.......
Done
Change Directory to mecab-ko-dic-2.1.1-20180720
Done
installing........
configure
make
make install
apt-get update
apt-get upgrade
apt install curl
apt install git
bash <(curl -s https://raw.githubusercontent.com/konlpy/konlpy/master/scripts/mecab.sh)
Done
Successfully Installed
Now you can use Mecab
from konlpy.tag import Mecab
mecab = Mecab()
사용자 사전 추가 방법 : https://bit.ly/3k0ZH53
NameError: name 'Tagger' is not defined 오류 발생 시 런타임을 재실행 해주세요
블로그에 해결 방법을 남겨주신 tana님 감사합니다.
네이버 쇼핑 리뷰 데이터에 대한 이해와 전처리
1 2 3 4 5 6 7 8 9 10
import re import pandas as pd import numpy as np import matplotlib.pyplot as plt import urllib.request from collections import Counter from konlpy.tag import Mecab from sklearn.model_selection import train_test_split from tensorflow.keras.preprocessing.text import Tokenizer from tensorflow.keras.preprocessing.sequence import pad_sequences
('ratings_total.txt', <http.client.HTTPMessage at 0x7f7d3557f750>)
해당 데이터에는 열 제목이 별도로 없음. 그래서 임의로 두 개의 열제목인 “ratings”와 “reviews” 추가
1 2 3
# (1) 데이터 불러오고, 전체 리뷰 개수 출력 # 200,000 totalDt = pd.read_table('ratings_total.txt', names=['ratings', 'reviews']) print('전체 리뷰 개수 :',len(totalDt)) # 전체 리뷰 개수 출력
ratings열의 경우 1, 2, 4, 5라는 네 가지 값을 가지고 있습니다. reviews열에서 중복을 제외한 경우 199,908개입니다. 현재 20만개의 리뷰가 존재하므로 이는 현재 갖고 있는 데이터에 중복인 샘플들이 있다는 의미입니다. 중복인 샘플들을 제거해줍니다.
1 2 3
# (2) review열에서 중복 데이터 제거 drop_duplicates() 함수 활용 totalDt.drop_duplicates(subset=['reviews'], inplace=True) print('총 샘플의 수 :',len(totalDt))
# 한글과 공백을 제외하고 모두 제거 # (4) 한글 및 공백 제외한 모든 글자 제거 train_data['reviews'] = train_data['reviews'].str.replace("[^ㄱ-ㅎㅏ-ㅣ가-힣 ]","") train_data['reviews'].replace('', np.nan, inplace=True) print(train_data.isnull().sum())
ratings 0
reviews 0
label 0
dtype: int64
테스트 데이터에 대해서도 같은 과정을 거칩니다.
1 2 3 4 5 6 7 8 9 10
# (5) 데스트 데이터에 적용하기 # 코드 1 중복 제거 # 코드 2 정규 표현식 수행 # 코드 3 공백은 Null 값으로 변경 # 코드 4 Null 값 제거 test_data.drop_duplicates(subset = ['reviews'], inplace=True) # 중복 제거 test_data['reviews'] = test_data['reviews'].str.replace("[^ㄱ-ㅎㅏ-ㅣ가-힣 ]","") # 정규 표현식 수행 test_data['reviews'].replace('', np.nan, inplace=True) # 공백은 Null 값으로 변경 test_data = test_data.dropna(how='any') # Null 값 제거 print('전처리 후 테스트용 샘플의 개수 :',len(test_data))
전처리 후 테스트용 샘플의 개수 : 49977
토큰화
형태소 분석기 Mecab을 사용하여 토큰화 작업을 수행한다.
1 2 3
# (6) Mecab 클래스 호출하기 mecab = Mecab() print(mecab.morphs('와 이런 것도 상품이라고 차라리 내가 만드는 게 나을 뻔'))
train_data['tokenized'] = train_data['reviews'].apply(mecab.morphs) train_data['tokenized'] = train_data['tokenized'].apply(lambda x: [item for item in x if item notin stopwords])
1 2
test_data['tokenized'] = test_data['reviews'].apply(mecab.morphs) test_data['tokenized'] = test_data['tokenized'].apply(lambda x: [item for item in x if item notin stopwords])
단어와 길이 분포 확인하기
긍정 리뷰에는 주로 어떤 단어들이 많이 등장하고, 부정 리뷰에는 주로 어떤 단어들이 등장하는지 두 가지 경우에 대해서 각 단어의 빈도수를 계산해보겠습니다. 각 레이블에 따라서 별도로 단어들의 리스트를 저장해줍니다.
이제 기계가 텍스트를 숫자로 처리할 수 있도록 훈련 데이터와 테스트 데이터에 정수 인코딩을 수행해야 합니다. 우선, 훈련 데이터에 대해서 단어 집합(vocaburary)을 만들어봅시다.
1 2 3
# (9) 정수 인코딩 클래스 호출 및 X_train 데이터에 적합하기 tokenizer = Tokenizer() tokenizer.fit_on_texts(X_train)
단어 집합이 생성되는 동시에 각 단어에 고유한 정수가 부여되었습니다. 이는 tokenizer.word_index를 출력하여 확인 가능합니다. 등장 횟수가 1회인 단어들은 자연어 처리에서 배제하고자 합니다. 이 단어들이 이 데이터에서 얼만큼의 비중을 차지하는지 확인해봅시다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
threshold = 2 total_cnt = len(tokenizer.word_index) # 단어의 수 rare_cnt = 0# 등장 빈도수가 threshold보다 작은 단어의 개수를 카운트 total_freq = 0# 훈련 데이터의 전체 단어 빈도수 총 합 rare_freq = 0# 등장 빈도수가 threshold보다 작은 단어의 등장 빈도수의 총 합
# 단어와 빈도수의 쌍(pair)을 key와 value로 받는다. for key, value in tokenizer.word_counts.items(): total_freq = total_freq + value
# 단어의 등장 빈도수가 threshold보다 작으면 if(value < threshold): rare_cnt = rare_cnt + 1 rare_freq = rare_freq + value
print('단어 집합(vocabulary)의 크기 :',total_cnt) print('등장 빈도가 %s번 이하인 희귀 단어의 수: %s'%(threshold - 1, rare_cnt)) print("단어 집합에서 희귀 단어의 비율:", (rare_cnt / total_cnt)*100) print("전체 등장 빈도에서 희귀 단어 등장 빈도 비율:", (rare_freq / total_freq)*100)
단어 집합(vocabulary)의 크기 : 39998
등장 빈도가 1번 이하인 희귀 단어의 수: 18213
단어 집합에서 희귀 단어의 비율: 45.53477673883694
전체 등장 빈도에서 희귀 단어 등장 빈도 비율: 0.7935698749320282
단어가 약 40,000개가 존재합니다. 등장 빈도가 threshold 값인 2회 미만. 즉, 1회인 단어들은 단어 집합에서 약 45%를 차지합니다. 하지만, 실제로 훈련 데이터에서 등장 빈도로 차지하는 비중은 매우 적은 수치인 약 0.8%밖에 되지 않습니다. 아무래도 등장 빈도가 1회인 단어들은 자연어 처리에서 별로 중요하지 않을 듯 합니다. 그래서 이 단어들은 정수 인코딩 과정에서 배제시키겠습니다.
등장 빈도수가 1인 단어들의 수를 제외한 단어의 개수를 단어 집합의 최대 크기로 제한하겠습니다.
1 2 3 4
# 전체 단어 개수 중 빈도수 2이하인 단어 개수는 제거. # 0번 패딩 토큰과 1번 OOV 토큰을 고려하여 +2 vocab_size = total_cnt - rare_cnt + 2 print('단어 집합의 크기 :',vocab_size)
단어 집합의 크기 : 21787
이제 단어 집합의 크기는 21,787개입니다. 이를 토크나이저의 인자로 넘겨주면, 토크나이저는 텍스트 시퀀스를 숫자 시퀀스로 변환합니다. 이러한 정수 인코딩 과정에서 이보다 큰 숫자가 부여된 단어들은 OOV로 변환하겠습니다.
이제 서로 다른 길이의 샘플들의 길이를 동일하게 맞춰주는 패딩 작업을 진행해보겠습니다. 전체 데이터에서 가장 길이가 긴 리뷰와 전체 데이터의 길이 분포를 알아보겠습니다.
1 2 3 4 5 6
print('리뷰의 최대 길이 :',max(len(l) for l in X_train)) print('리뷰의 평균 길이 :',sum(map(len, X_train))/len(X_train)) plt.hist([len(s) for s in X_train], bins=35, label='bins=35', color="skyblue") plt.xlabel('length of samples') plt.ylabel('number of samples') plt.show()
리뷰의 최대 길이 : 85
리뷰의 평균 길이 : 15.307521459871541
리뷰의 최대 길이는 85, 평균 길이는 약 15입니다.
그리고 그래프로 봤을 때, 전체적으로는 60이하의 길이를 가지는 것으로 보입니다.
1 2 3 4 5 6 7 8
defbelow_threshold_len(max_len, nested_list): count = 0 for sentence in nested_list: if(len(sentence) <= max_len): count = count + 1 print('전체 샘플 중 길이가 %s 이하인 샘플의 비율: %s'%(max_len, (count / len(nested_list))*100))
최대 길이가 85이므로 만약 80으로 패딩할 경우, 몇 개의 샘플들을 온전히 보전할 수 있는지 확인해봅시다.
from tensorflow.keras.layers import Embedding, Dense, GRU from tensorflow.keras.models import Sequential from tensorflow.keras.models import load_model from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint
embedding_dim = 100 hidden_units = 128
model = Sequential() model.add(Embedding(vocab_size, embedding_dim)) model.add(GRU(hidden_units)) model.add(Dense(1, activation='sigmoid'))
es = EarlyStopping(monitor='val_loss', mode='min', verbose=1, patience=4) mc = ModelCheckpoint('best_model.h5', monitor='val_acc', mode='max', verbose=1, save_best_only=True)
deftry_func(x, idx): try: return100/x[idx] except ZeroDivisionError: print("did't divide zero") except IndexError: print("not in range of Index") except TypeError: print("there is type Error") except NameError: print("it is not definated parameter") finally: print("무조건 실행됨")
defmain(): a = [50, 60, 0, 70] print(try_func(a,1))
# Zero Division Error print(try_func(a,0))
# Index Error print(try_func(a,5))
# type Error print(try_func(a, "hi"))
if __name__ == "__main__": main()
어떻게던 프로그램이 돌아 갈 수 있도록 만들어 주는 것이 중요하다.
class 정리
__init__ : set_name, set_id 해 주지 않고, 통합시켜주는 역할
__eq__, __ne__ : 부등호 연산자
상속, 다형성(서로다른 클래스에서 공통으로 쓰는 함수)
Exception
class attribute / instance attribute / instance method 차이
def__init__(self, name, salary = 30000): self.name = name if salary< Employee.MIN_SALARY: raise SalaryExcept("급여가 너무 낮아요!") self.salary = salary
defgive_bonus(self, amount): if amount > Employee.MAX_Bonus: print("보너스가 너무 많아 ") elif self.salary + amount < Employee.MIN_SALARY : print("보너스 지급 후의 급여도 매우 낮다. ") else: self.salary += amount
if __name__ == "__main__": emp = Employee("YH", salary= 10000)
with mlflow.start_run(run_name="MLflow on Colab"): mlflow.log_metric("m1", 2.0) mlflow.log_param("p1", "mlflow-colab")
# run tracking UI in the background get_ipython().system_raw("mlflow ui --port 5000 &") # run tracking UI in the background
# create remote tunnel using ngrok.com to allow local port access # borrowed from https://colab.research.google.com/github/alfozan/MLflow-GBRT-demo/blob/master/MLflow-GBRT-demo.ipynb#scrollTo=4h3bKHMYUIG6
from pyngrok import ngrok
# Terminate open tunnels if exist ngrok.kill()
# Setting the authtoken (optional) # Get your authtoken from https://dashboard.ngrok.com/auth NGROK_AUTH_TOKEN = "" ngrok.set_auth_token(NGROK_AUTH_TOKEN)
# Open an HTTPs tunnel on port 5000 for http://localhost:5000 ngrok_tunnel = ngrok.connect(addr="5000", proto="http", bind_tls=True) print("MLflow Tracking UI:", ngrok_tunnel.public_url)
|████████████████████████████████| 745 kB 5.4 MB/s
Building wheel for pyngrok (setup.py) ... done
---------------------------------------
Exception Traceback (most recent call last) in ()
4 import mlflow
5
----> 6 with mlflow.start_run(run_name="MLflow on Colab"):
7 mlflow.log_metric("m1", 2.0)
8 mlflow.log_param("p1", "mlflow-colab")
/usr/local/lib/python3.7/dist-packages/mlflow/tracking/fluent.py in start_run(run_id, experiment_id, run_name, nested, tags)
229 + “current run with mlflow.end_run(). To start a nested “
230 + “run, call start_run with nested=True”
–> 231 ).format(_active_run_stack[0].info.run_id)
232 )
233 client = MlflowClient()
Exception: Run with UUID 3cbca838cdd44eac8620700ac1929a64 is already active.
To start a new run, first end the current run with mlflow.end_run().
To start a nested run, call start_run with nested=True
# This Python 3 environment comes with many helpful analytics libraries installed # It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python # For example, here's several helpful packages to load
import numpy as np # linear algebra import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
# Input data files are available in the read-only "../input/" directory # For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory
import os for dirname, _, filenames in os.walk('/kaggle/input'): for filename in filenames: print(os.path.join(dirname, filename))
# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using "Save & Run All" # You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session
데이터 다운로드 및 불러오기
1 2 3 4 5 6 7
import pandas as pd
train = pd.read_csv("/kaggle/input/house-prices-advanced-regression-techniques/train.csv") test = pd.read_csv("/kaggle/input/house-prices-advanced-regression-techniques/test.csv")
train.shape, test.shape #변수를 줄여야 겠다. 어떤 변수를 줄여야 할까 ?
import seaborn as sns import matplotlib.pyplot as plt from scipy.stats import norm
(mu, sigma) = norm.fit(train['SalePrice']) print("The value of mu before log transformation is:", mu) print("The value of sigma before log transformation is:", sigma)
train["SalePrice"] = np.log1p(train["SalePrice"]) # 로그 변환 후 종속 변수 시각화
(mu, sigma) = norm.fit(train['SalePrice']) print("The value of mu before log transformation is:", mu) print("The value of sigma before log transformation is:", sigma)
#object column, 갯수 확인 import numpy as np cat_all_vars = train.select_dtypes(exclude=[np.number]) #숫자인 것을 제외한 type column 이름 추출 print("The whole number of all_vars(문자형data)", len(list(cat_all_vars)))
#column 이름 뽑아내기 final_cat_vars = [] for v in cat_all_vars: if v notin ['PoolQC', 'MiscFeature', 'Alley', 'Fence', 'FireplaceQu', 'LotFrontage']: final_cat_vars.append(v)
print("The whole number of final_cat_vars", len(final_cat_vars))
#최빈값을 찾아 넣어주기 for i in final_cat_vars: all_df[i] = all_df[i].fillna(all_df[i].mode()[0])
check_na(all_df, 20) print("숫자형 data set의 결측치만 남은 것을 알 수 있다. ")
1 2 3 4 5 6 7 8 9 10 11 12
import numpy as np num_all_vars = list(train.select_dtypes(include=[np.number])) print("The whole number of all_vars", len(num_all_vars))
num_all_vars.remove('LotFrontage')
print("The whole number of final_cat_vars", len(num_all_vars)) for i in num_all_vars: all_df[i].fillna(value=all_df[i].median(), inplace=True)
print("결측치가 존재 하지 않은 것을 알 수 있다. ") check_na(all_df, 20)
1
all_df.info()
왜도(Skewnewss) 처리하기 : 정규 분포를 이룰 수 있게 (설문조사 논문 통계의 경우 -1< 외도 <1)
boxcose를 사용 할 예정
왜도가 양수일때, 음수일때 (좌, 우로 치우친 정도)
첨도가 양수일때, 음수일때 (뽀족한 정도)
RMSE를 최적(낮게)으로 만들기 위해 조정.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
from scipy.stats import skew
#외도 판정을 받을 만한 data set을 확인 deffind_skew(x): return skew(x) #앞에서 뽑은 numeric columns : num_all_vars #사용자 정의함수를 쓰기 위해 apply(find_skew)를 사용, 오름차순정렬
#0~1사이에 있는 것이 기준. 기준 밖으로 나간 경우 조정이 필요(정규분포를 만들어 주기 위해) # 1. 박스코스 변환 : ML -> RMSE (2.5) # 2. 로그변환 : ML -> RMSE (2.1) # => RMSE는 적은 것이 좋기 때문에, 로그 변환으로 사용 하는 것이 좋다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14
skewnewss_index = list(skewness_features.index) skewnewss_index.remove('LotArea') #외도 정도가 너무 높은 LotArea를 날려주는 것. all_numeric_df = all_df.loc[:, skewnewss_index]
fig, ax = plt.subplots(figsize=(10, 6)) ax.set_xlim(0, all_numeric_df.max().sort_values(ascending=False)[0]) ax = sns.boxplot(data=all_numeric_df[skewnewss_index] , orient="h", palette="Set1") ax.xaxis.grid(False) ax.set(ylabel="Feature names") ax.set(xlabel="Numeric values") ax.set(title="Numeric Distribution of Features Before Box-Cox Transformation") sns.despine(trim=True, left=True)
1 2 3 4 5 6 7 8 9 10 11 12
from scipy.special import boxcox1p from scipy.stats import boxcox_normmax
따라서 data 정의서 먼저 봐야 한다. : data description.txt를 먼저 봐야 한다. !!! (실무에서는 없는 경우가 많다.)
시각화 : 각각의 data 무한작업, 도메인 공부
1 2 3 4 5 6 7 8 9 10 11
# 연도와 관련된. num_all_vars = list(train.select_dtypes(include=[np.number])) year_feature = [] for var in num_all_vars: if'Yr'in var: year_feature.append(var) elif'Year'in var: year_feature.append(var) else: print(var, "is not related with Year") print(year_feature)
1 2 3 4 5 6 7 8
fig, ax = plt.subplots(3, 1, figsize=(10, 6), sharex=True, sharey=True) for i, var inenumerate(year_feature): if var != 'YrSold': ax[i].scatter(train[var], y, alpha=0.3) ax[i].set_title('{}'.format(var), size=15) ax[i].set_ylabel('SalePrice', size=15, labelpad=12.5) plt.tight_layout() plt.show()
from sklearn.metrics import mean_squared_error from sklearn.model_selection import KFold, cross_val_score from sklearn.linear_model import LinearRegression
defcv_rmse(model, n_folds=5): cv = KFold(n_splits=n_folds, random_state=42, shuffle=True) rmse_list = np.sqrt(-cross_val_score(model, X, y, scoring='neg_mean_squared_error', cv=cv)) print('CV RMSE value list:', np.round(rmse_list, 4)) print('CV RMSE mean value:', np.round(np.mean(rmse_list), 4)) return (rmse_list)
from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor from sklearn.tree import DecisionTreeRegressor from sklearn.linear_model import LinearRegression
# LinearRegresison lr_model = LinearRegression()
# Tree Decision tree_model = DecisionTreeRegressor()
# Random Forest Regressor rf_model = RandomForestRegressor()
for i, feature inenumerate(lm_features): row = int(i/4) col = i%4 print("row is {}, col is {}".format(row, col)) sns.regplot(x = feature, y = "medv", data = bostonDF, ax = ax[row][col])
두 연속형 변수를 활용한 산점도나 회귀식 가능.
박스플롯 (x: 명목형, y: medv)
rm 3.4 chas 3.0 rad 0.4 zn 0.1 b 0.0 tax -0.0 age 0.0 indus 0.0 crim -0.1 lstat -0.6 ptratio -0.9 dis -1.7 nox -19.8
1 2 3 4 5 6 7
from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression # model
deftimer(func): """ 함수 실행 시간 확인 :param func: check할 함수 넣을거임 :return: 걸린 시간 """ defwrapper(*args, **kwargs): #현재 시간 time_start = time.time()
#decorated function 불러오기 result = func(*args, **kwargs) time_total = time.time() - time_start # print("{}, Total time is {: .2f} sec.".format(func.__name__, time_total))
return result return wrapper
가변 매개 변수 args(*)
함수를 정의할때 앞에 *가 붙어 있으면, 정해지지 않은 수의 매개변수를 받겠다는 의미
가변 매개변수는 입력 받은 인수를 튜플형식으로 packing 한다.
일반적으로 *args (arguments의 약자로 관례적으로 사용) 를 사용한다.
다른 매개 변수와 혼용가능
키워드 매개변수 kwargs(**)
함수에서 정의되지 않은 매개변수를 받을 때 사용되며, 딕셔너리 형식으로 전달.
일반 매개변수, 가변 매개변수와 함께 일는 경우 순서를 지켜야함 (일반>가변>키워드 순)
**kwargs (Keyword arguments의 약자로 관례적으로 사용 )
decorator 함수를 이용하여 시간 확인 함수 설정, 실행
1 2 3 4 5 6 7 8
@timer defcheck_time(num): time.sleep(num)
if __name__ == "__main__": check_time(1.5)
out
check_time, Total time is 1.50 sec.
관련 이론들을 아래에 적어 놓았다.
timestamp :python에서 time은 1970년 1월 1일 0시 0분 0초를 기준으로 경과한 시간을 나타냄