๐ ํ์ด์ฌ ๋จธ์ ๋ฌ๋ ์๋ฒฝ๊ฐ์ด๋ ๊ณต๋ถ ๋ด์ฉ ์ ๋ฆฌ
๐ ์ค์ต ์ฝ๋
https://colab.research.google.com/drive/1aMlFfX927tDFnPUisw2M3tB6NwGy5c7q?usp=sharing
1๏ธโฃ ๋ฌธ์ ๊ตฐ์งํ
๐ก ๋ฌธ์ ๊ตฐ์งํ
โ ๊ฐ๋
- ๋น์ทํ ํ ์คํธ ๊ตฌ์ฑ์ ๋ฌธ์๋ฅผ ๊ตฐ์งํ ํ๋ ๊ฒ
- ํ ์คํธ ๋ถ๋ฅ ๊ธฐ๋ฐ์ ๋ฌธ์ ๋ถ๋ฅ๋ ์ฌ์ ์ target category ๊ฐ์ด ํ์ํ์ง๋ง, ์ด ์์ด๋ ๋น์ง๋ ํ์ต ๊ธฐ๋ฐ์ผ๋ก ๋์ ๊ฐ๋ฅํ๋ค.
1. ํ ์คํธ ํ ํฐํ & ๋ฒกํฐํ
2. ๊ตฐ์งํ ์๊ณ ๋ฆฌ์ฆ ์ ์ฉ : Kmeans
3. cluster_centers_ ๋ก ๊ตฐ์ง๋ณ ํต์ฌ ๋จ์ด ์ถ์ถํ๊ธฐ
โ ์ค์ต - ์ํ/์๋น์ค ๋ฆฌ๋ทฐ ๋ฐ์ดํฐ ์นดํ ๊ณ ๋ฆฌ๋ณ ๊ตฐ์งํ
# ๐ ๋ฐ์ดํฐ ํ๋ ์ ๋ง๋ค๊ธฐ
document_df = pd.DataFrame({'filename' : filename_list, 'opinion_text' : opinion_text})
# ๐ ํ ํฐํ ํจ์ ๋ง๋ค๊ธฐ
from nltk.stem import WordNetLemmatizer
import nltk
remove_punct_dict = dict((ord(punct), None) for punct in string.punctuation)
lemmar = WordNetLemmatizer()
def LemTokens(tokens):
return [lemmar.lemmatize(token) for token in tokens]
def LemNormalize(text):
return LemTokens(nltk.word_tokenize(text.lower().translate(remove_punct_dict)))
#๐ ํผ์ฒ ๋ฒกํฐํ
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf_vect = TfidfVectorizer(tokenizer = LemNormalize, stop_words = 'english', ngram_range=(1,2), min_df = 0.05, max_df = 0.85)
feature_vect = tfidf_vect.fit_transform(document_df['opinion_text'])
# ๐ K-means clustering : (์๋์ฐจ-์ ์์ ํ-ํธํ
)
from sklearn.cluster import KMeans
km_cluster = KMeans(n_clusters=5, max_iter = 10000, random_state=0)
km_cluster.fit(feature_vect) # โจ
cluster_label = km_cluster.labels_
cluster_centers = km_cluster.cluster_centers_
document_df['cluster_label'] = cluster_label
# ๐ ๊ตฐ์ง๋ณ ํต์ฌ ๋จ์ด ์ถ์ถํ๊ธฐ
cluster_centers = km_cluster.cluster_centers_ #โญ
print('cluster_centers shape :',cluster_centers.shape)
print(cluster_centers)
# ํ : ๊ฐ๋ณ ๊ตฐ์ง --> 3๊ฐ์ ๊ตฐ์ง
# ์ด : ๊ฐ๋ณ ํผ์ฒ --> 4611๊ฐ์ word feature
# ๊ฐ : 0~1 ์ฌ์ด์ ๊ฐ์ผ๋ก 1์ ๊ฐ๊น์ธ์๋ก ์ค์ฌ๊ณผ ๊ฐ๊น์ด ๊ฐ์ ์๋ฏธํ๋ค.
cluster_centers shape : (3, 4611)
[[0. 0.00099499 0.00174637 ... 0. 0.00183397 0.00144581]
[0.01005322 0. 0. ... 0.00706287 0. 0. ]
[0. 0.00092551 0. ... 0. 0. 0. ]]
๐จ cluster_model.cluster_centers_.argsort()[:,::-1] → array ๊ฐ์ด ํฐ ์์๋๋ก ์ ๋ ฌ๋ index ๊ฐ์ ๋ฐํ
2๏ธโฃ ๋ฌธ์ ์ ์ฌ๋
๐ ๊ฐ์
๐ก ์ฝ์ฌ์ธ ์ ์ฌ๋
โ ์ฝ์ฌ์ธ ์ ์ฌ๋ cosθ
- ๋ฒกํฐ์ ํฌ๊ธฐ๋ณด๋ค๋ ๋ฒกํฐ์ ์ํธ ๋ฐฉํฅ์ฑ์ด ์ผ๋ง๋ ์ ์ฌํ์ง์ ๊ธฐ๋ฐํ๋ค ๐ ๋ ๋ฒกํฐ ์ฌ์ด์ ์ฌ์๊ฐ์ ๊ตฌํด์ ์ผ๋ง๋ ์ ์ฌํ์ง ์์น๋ก ์ ์ฉํ๋ค.
- 90โฆ ์ดํ : ์ ์ฌ ๋ฒกํฐ๋ค
- 90โฆ : ๊ด๋ จ์ฑ์ด ์๋ ๋ฒกํฐ๋ค
- 90~180โฆ : ๋ฐ๋ ๊ด๊ณ์ธ ๋ฒกํฐ๋ค
โ ์ฝ์ฌ์ธ ์ ์ฌ๋๊ฐ ๋ฌธ์ ์ ์ฌ๋๋ก ์์ฃผ ์ฌ์ฉ๋๋ ์ด์
- ๋ฌธ์๋ฅผ ํผ์ฒ๋ฒกํฐํํ ํ๋ ฌ์ ํฌ์ํ๋ ฌ์ผ ๊ฒฝ์ฐ๊ฐ ๋์๋ฐ, ํฌ์ํ๋ ฌ ๊ธฐ๋ฐ์ ๋ฌธ์์ ๋ฌธ์ ๋ฒกํฐ ๊ฐ์ 'ํฌ๊ธฐ' ์ ๊ธฐ๋ฐํ ์ ์ฌ๋ ์งํ (์ ํด๋ฆฌ๋ ๊ฑฐ๋ฆฌ ๊ธฐ๋ฐ) ๋ ์ ํ๋๊ฐ ๋จ์ด์ง๊ธฐ ์ฝ๋ค.
- ๋ฌธ์์ ๊ธธ์ด๊ฐ ๊ธด ๊ฒฝ์ฐ์๋ ๋น๋์(ํฌ๊ธฐ) ์ ๊ธฐ๋ฐํ ๋น๊ต๊ฐ ์ด๋ ต๋ค. ๊ฐ๋ น ์ธ ๋ฌธ์ฅ์ผ๋ก ๊ตฌ์ฑ๋ B ๋ฌธ์์ ํ๊ธ์ด๋ผ๋ ๋จ์ด๊ฐ 3๋ฒ ๋ฑ์ฅํ๊ณ , 30๊ฐ ๋ฌธ์ฅ์ผ๋ก ๊ตฌ์ฑ๋ A ๋ฌธ์์ ํ๊ธ์ด๋ผ๋ ๋จ์ด๊ฐ 5๋ฒ ๋ฑ์ฅํ์ ๋, B ๋ฌธ์๊ฐ ํ๊ธ๊ณผ ๋ ๋ฐ์ ํ๊ฒ ๊ด๋ จ๋ ๋ฌธ์๋ผ ํ๋จํ ์ ์๋ค.
โ ์ฌ์ดํท๋ฐ ๋ชจ๋
from sklearn.metrics.pairwise import cosine_similarity
|
- ํฌ์ํ๋ ฌ, ๋ฐ์งํ๋ ฌ ๋ชจ๋ ๊ฐ๋ฅ
- ํ๋ ฌ ๋๋ ๋ฐฐ์ด ๋ชจ๋ ๊ฐ๋ฅ
from sklearn.feature_extraction.text import TfidfVectorizer
doc_list = ['if you take the blue pill, the story ends' ,
'if you take the red pill, you stay in Wonderland',
'if you take the red pill, I show you how deep the rabbit hole goes']
tfidf_vect_simple = TfidfVectorizer()
feature_vect_simple = tfidf_vect_simple.fit_transform(doc_list)
print(feature_vect_simple.shape)
(3,18)
# 3๊ฐ ๋ฌธ์ฅ, 18๊ฐ์ (์ค๋ณต์๋) ๋จ์ด ๋ฒกํฐ
from sklearn.metrics.pairwise import cosine_similarity
#๐ first parameter : ๋น๊ต ๊ธฐ์ค์ด ๋๋ ๋ฌธ์์ ํผ์ฒํ๋ ฌ
#๐ second parameter : ๋น๊ต๋๋ ๋ฌธ์์ ํผ์ฒํ๋ ฌ
# ์ฒซ๋ฒ์งธ ๋ฌธ์ ๊ธฐ์ค์ผ๋ก ๋๋จธ์ง ๋ฌธ์์ ์ ์ฌ๋ ๊ณ์ฐํด๋ณด๊ธฐ
pair = cosine_similarity(feature_vect_simple[0], feature_vect_simple)
print(pair)
[[1. 0.40207758 0.40425045]]
# ์ ์ฒด ๋ฌธ์์ ๋ํด ์ ์ฌ๋ ๊ตฌํด๋ณด๊ธฐ
sim_cos = cosine_similarity(feature_vect_simple, feature_vect_simple)
print(sim_cos)
print(sim_cos.shape)
[[1. 0.40207758 0.40425045]
[0.40207758 1. 0.45647296]
[0.40425045 0.45647296 1. ]]
(3, 3)
๐ ๋ฌธ์ ์ ์ฌ๋ ๊ฒฐ๊ณผ ์๊ฐํ ์์ - Opinion review data
3๏ธโฃ ํ๊ธ ํ ์คํธ ์ฒ๋ฆฌ
๐ ๋ค์ด๋ฒ ์ํ ํ์ ๋ฐ์ดํฐ ๊ธฐ๋ฐ ๊ฐ์ฑ๋ถ์
๐ก ํ๊ธ NLP ์ฒ๋ฆฌ์ ์ด๋ ค์
โ ๋์ด์ฐ๊ธฐ
- ์์ด์ ๊ฒฝ์ฐ ๋์ด์ฐ๊ธฐ๋ฅผ ์๋ชปํ๋ฉด ์๋/์๋ชป๋ ๋จ์ด๋ก ์ธ์๋๋ค.
- ๊ทธ๋ฌ๋ ํ๊ตญ์ด๋ ๋์ด์ฐ๊ธฐ์ ๋ฐ๋ผ ์๋ฏธ๊ฐ ๋ฌ๋ผ์ง๋ ๊ฒฝ์ฐ๊ฐ ์กด์ฌํ๋ค.
- ex. ์๋ฒ์ง ๊ฐ๋ฐฉ์ ๋ค์ด๊ฐ์ ๋ค, ์๋ฒ์ง๊ฐ ๋ฐฉ์ ๋ค์ด๊ฐ์ ๋ค
โ ๋ค์ํ ์กฐ์ฌ
- ์๋ ๊ฒฝ์ฐ์ ์๊ฐ ๋ง๊ธฐ ๋๋ฌธ์ ์ด๊ทผ ์ถ์ถ ๋ฑ์ ์ ์ฒ๋ฆฌ ์ ์ ๊ฑฐํ๊ธฐ๊ฐ ์ด๋ ต๋ค.
- ๋ผํด์ด ๊ณ์ด์ ์ธ์ด๋ณด๋ค NLP ์ฒ๋ฆฌ๊ฐ ์ด๋ ต๋ค.
๐ก KoNLPy
โ ๋ํ์ ์ธ ํ๊ธ ํํ์ ํจํค์ง
- ํํ์ ๋ถ์ : ๋ง๋ญ์น๋ฅผ ํํ์ (๋จ์ด๋ก์ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ ์ต์ ๋จ์) ์ด๊ทผ ๋จ์๋ก ์ชผ๊ฐ๊ณ ๊ฐ ํํ์์ ํ์ฌ ํ๊น (POS tagging) ์ ๋ถ์ฐฉํ๋ ์์ ์ ์ง์นญํ๋ค.
- Kkma, Hannanum, Komoran, Mecab, Twitter ํํ์ ๋ถ์ ๋ชจ๋์ ์ฌ์ฉํ ์ ์๋ค.
๐ก ์ค์ต
๐โ๏ธ ๊ฐ์ ๋ ์ด๋ธ ๋ถํฌ ํ์ธ
๐โ๏ธ ํ ์คํธ ์ ์ฒ๋ฆฌ
# ๋๊ฐ์ ๊ณต๋ฐฑ์ผ๋ก ๋ณํ
import re
train_df = train_df.fillna(' ')
# ๋ฌธ์์ ์ซ์๋ ๊ณต๋ฐฑ์ผ๋ก ๋ณํ : \d ๋ ์ ๊ทํํ์์ผ๋ก ์ซ์๋ฅผ ์๋ฏธ
train_df['document'] = train_df['document'].apply(lambda x : re.sub(r'\d+', " ", x))
# test set ์๋ ๋์ผํ๊ฒ ์ ์ฉํ๊ธฐ
test_df = pd.read_csv('ratings_test.txt', sep='\t')
test_df = test_df.fillna(' ')
test_df['document'] = test_df['document'].apply( lambda x : re.sub(r"\d+", " ", x) )
๐โ๏ธ ํ ํฐํ + TfidfVectorizer
# ๐ ํ๊ธ ํํ์ ๋ถ์์ ํตํด ํํ์ ๋จ์ด๋ก ํ ํฐํํ๊ธฐ
# โจ SNS ๋ถ์์ ์ ํฉํ Twitter class
from konlpy.tag import Okt
okt = Okt()
def tw_tokenizer(text) :
tokens_ko = okt.morphs(text) # ํ ํฐํ
return tokens_ko
# ๐ ํ
์คํธ ๋ฒกํฐํ
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GridSearchCV
# โญ ์์์ ์ ์ํ ํ ํฐํ๋ฅผ Tfidf tokenizer ์ธ์๋ก ๋๊ธฐ๊ธฐ
## ์ํ์๊ฐ 10๋ถ ์ด์ ์์ํจ
tfidf_vect = TfidfVectorizer(tokenizer = tw_tokenizer, ngram_range =(1,2), min_df = 3, max_df = 0.9)
tfidf_vect.fit(train_df['document'])
tfidf_matrix_train = tfidf_vect.transform(train_df['document'])
๐โ๏ธ ๋ก์ง์คํฑ ํ๊ท ํ๋ จ : GridSearchCV
# ๐ ๋ก์ง์คํฑ ํ๊ท ๊ฐ์ฑ ๋ถ์ ๋ถ๋ฅ ์ํ : GridSearchCV
lg_clf = LogisticRegression(random_state=0)
params = {
'C' : [1,3.5,4.5,5.5,10]
}
grid_cv = GridSearchCV(lg_clf, param_grid = params, cv = 3, scoring='accuracy', verbose=1)
grid_cv.fit(tfidf_matrix_train, train_df['label'])
print(grid_cv.best_params_, round(grid_cv.best_score_,4))
# C = 3.5์ผ ๋ ์ต์
๐โ๏ธ test data set ์์ธก ์ํ
# ๐ ํ
์คํธ ์ธํธ๋ก ์ต์ข
๊ฐ์ฑ ๋ถ์ ์์ธก ์ํํ๊ธฐ
from sklearn.metrics import accuracy_score
tfidf_matrix_test = tfidf_vect.transform(test_df['document'])
best_estimator = grid_cv.best_estimator_ # โญโญ
preds = best_estimator.predict(tfidf_matrix_test) # โญโญ
print('๋ก์ง์คํฑ ํ๊ท ์ ํ๋ : ', accuracy_score(test_df['label'], preds))
# 0.86172
4๏ธโฃ ์ค์ต
๐ ๋ํ ์จ๋ผ์ธ ์ผํ๋ชฐ Mercari ์ ํ ๊ฐ๊ฒฉ ์์ธก
๐ก ๋ํ ๋ชฉํ, ๋ฐ์ดํฐ์ ์๊ฐ
โ ์ ํ์ ๋ํ ์ฌ๋ฌ ์์ฑ ๋ฐ ์ ํ ์ค๋ช ๋ฑ์ ํ ์คํธ ๋ฐ์ดํฐ ๐ ์ ํ ์์ ๊ฐ๊ฒฉ์ ํ๋งค์๋ค์๊ฒ ์ ๊ณต
train_id | ๋ฐ์ดํฐ id |
name | ์ ํ๋ช - text |
item_condition_id | ํ๋งค์๊ฐ ์ ๊ณตํ๋ ์ ํ์ํ (ํ ์คํธ ๋ฒ์ฃผ) |
category_name | ์นดํ ๊ณ ๋ฆฌ ๋ช - text |
brand_name | ๋ธ๋๋ ์ด๋ฆ -text |
price | ์ ํ ๊ฐ๊ฒฉ, ์์ธก์ ์ํ ํ๊น ์์ฑ์ ํด๋น |
shipping | ๋ฐฐ์ก๋น ๋ฌด๋ฃ ์ฌ๋ถ (1์ด๋ฉด ๋ฌด๋ฃ๋ก ํ๋งค์๊ฐ ์ง๋ถ, 0์ด๋ฉด ๊ตฌ๋งค์ ์ง๋ถ) |
item_description | ์ ํ์ ๋ํ ์ค๋ช -text |
๐ ํ ์คํธ + ์ ํ (๋ฒ์ฃผํ) ๋ฐ์ดํฐ๋ฅผ ์ ์ฉํด ํ๊ท๋ถ์์ ์ํ
๐ก ๋ถ์ ํ๋ฆ
1๏ธโฃ ์ ์ฒ๋ฆฌ
๐โ๏ธ ์นผ๋ผ๋ณ ๋ฐ์ดํฐ ์ ํ/๋๊ฐ ํ์ธ
s.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1482535 entries, 0 to 1482534
Data columns (total 8 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 train_id 1482535 non-null int64
1 name 1482535 non-null object
2 item_condition_id 1482535 non-null int64
3 category_name 1476208 non-null object
4 brand_name 849853 non-null object
5 price 1482535 non-null float64
6 shipping 1482535 non-null int64
7 item_description 1482531 non-null object
dtypes: float64(1), int64(3), object(4)
memory usage: 90.5+ MB
๐จ brand_name ์ ์ํ ๋ธ๋๋ ์ด๋ฆ์ผ๋ก ๊ฐ๊ฒฉ์ ์ํฅ์ ๋ฏธ์น๋ ์ฃผ์ ์์ธ์ผ๋ก ํ๋จ๋๋, ๋๊ฐ์ด ๋๋ฌด ๋ง๋ค.
๐จ category_name, item_descriptoin ๋ ๋๊ฐ์ด ์กด์ฌํจ
๐โ๏ธ target ๋ถํฌ ํ์ธ
# price ๊ฐ ๋ถํฌ ์ดํด๋ณด๊ธฐ
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
y_train_df = s['price']
plt.figure(figsize=(6,4))
sns.distplot(y_train_df, kde = False) # ๊ฐ๊ฒฉ์ด ๋ฎ์ ๋ฐ์ดํฐ๊ฐ ๋ง์ ๐ ๋ก๊ทธ๋ณํ ๋ค ๋ค์ ์ดํด๋ณด๊ธฐ
import numpy as np
y_train_df = np.log1p(y_train_df)
sns.distplot(y_train_df, kde=False)
# ๋ก๊ทธ๋ณํ ๋ค, ๊ฐ์ด ๋น๊ต์ ์ ๊ท๋ถํฌ์ ๊ฐ๊น์ด ๋ฐ์ดํฐ๋ฅผ ์ด๋ฃจ๊ฒ ๋จ ๐ ์๋ ๋ฐ์ดํฐ์๋ ๋ก๊ทธ ๋ณํ์ ์ ์ฉํ๊ธฐ
s['price'] = np.log1p(s['price'])
๐โ๏ธ ์นผ๋ผ๋ณ๋ก ์์ธํ ์ดํด๋ณด๊ธฐ - int64 ํ์ ์ธ shipping ์นผ๋ผ๊ณผ item_condition_id ์นผ๋ผ
print('shipping ๊ฐ ์ ํ \n', s.shipping.value_counts()) # ๋ถํฌ๊ฐ ๋น๊ต์ ๊ท ์ผ
print('item_condition_id ๊ฐ ์ ํ', s.item_condition_id.value_counts()) # ํ๋งค์๊ฐ ์ ๊ณตํ๋ ์ ํ ์ํ๋ก, ์์ธํ ๊ฐ ๊ฐ์ ์๋ฏธ๋ฅผ ์ ์ ์์ผ๋, 1,2,3 ๊ฐ์ด ์์ฃผ๋ก ์ด๋ฃจ์ด์ง
shipping ๊ฐ ์ ํ
0 819435
1 663100
Name: shipping, dtype: int64
item_condition_id ๊ฐ ์ ํ 1 640549
3 432161
2 375479
4 31962
5 2384
Name: item_condition_id, dtype: int64
๐โ๏ธ ์นผ๋ผ๋ณ๋ก ์์ธํ ์ดํด๋ณด๊ธฐ - object ํ์ ์ธ item_description ์นผ๋ผ ์ดํด๋ณด๊ธฐ
# ์ ํ ์ค๋ช
์นผ๋ผ์ Null ๊ฐ์ด ๋ณ๋ก ์๊ธด ํ์ง๋ง, ๋ณ๋ ์ค๋ช
์ด ์๋ ๊ฒฝ์ฐ 'No description yet' ์ผ๋ก ๋์ด์๋ค ๐ ์ผ๋ง๋ ๋ง์์ง ์ดํด๋ณด๊ธฐ
boolean_cond = s['item_description'] == 'No description yet'
s[boolean_cond]['item_description'].count() # 82489๊ฑด : ์๋ฏธ์๋ ์์ฑ๊ฐ์ผ๋ก ์ฌ์ฉ๋ ์ ์์ ๐ ์ ์ ํ ๊ฐ์ผ๋ก์ ๋ณ๊ฒฝ์ด ํ์
๐โ๏ธ ์นผ๋ผ๋ณ๋ก ์์ธํ ์ดํด๋ณด๊ธฐ - object ํ์ ์ธ categort_name ์นผ๋ผ ์ดํด๋ณด๊ธฐ
# category_name ์นผ๋ผ ์ดํด๋ณด๊ธฐ
# Men/Top/T-shirts ์ฒ๋ผ
# / ๋ก ๋ถ๋ฆฌ๋ ์นดํ
๊ณ ๋ฆฌ๋ฅผ ํ๋์ ๋ฌธ์์ด๋ก ๋ํ๋ด๊ณ ์๋ค ๐ ๋จ์ด๋ฅผ ํ ํฐํ ํ์ฌ ๋ณ๋์ ํผ์ฒ๋ก ์ ์ฅํ๊ธฐ
def split_cat(category_name) :
try:
return category_name.split('/')
except :
return ['Other_Null', 'Other_Null', 'Other_Null'] # Null ์ผ ๊ฒฝ์ฐ ๋ฐํ๊ฐ
# ๋๋ถ๋ฅ/์ค๋ถ๋ฅ/์๋ถ๋ฅ
s['cat_dae'], s['cat_jung'], s['cat_so'] = zip(*s['category_name'].apply(lambda x : split_cat(x)))
# โจ zip ๊ณผ * ๋ฅผ ์ฌ์ฉํ๋ฉด, ์์ฑ๋ ๋ฆฌ์คํธ์ ๊ฐ ์์๋ฅผ ์ฌ๋ฌ ๊ฐ์ ์นผ๋ผ์ผ๋ก ๊ฐ๋จํ๊ฒ ๊ฐ์ ๋ถ๋ฆฌํ ์ ์๋ค.
print('๋๋ถ๋ฅ ์ ํ : \n', s['cat_dae'].value_counts())
print('์ค๋ถ๋ฅ ๊ฐ์ :', s['cat_jung'].nunique())
print('์๋ถ๋ฅ ๊ฐ์ :', s['cat_so'].nunique())
๋๋ถ๋ฅ ์ ํ :
Women 664385
Beauty 207828
Kids 171689
Electronics 122690
Men 93680
Home 67871
Vintage & Collectibles 46530
Other 45351
Handmade 30842
Sports & Outdoors 25342
Other_Null 6327
Name: cat_dae, dtype: int64
์ค๋ถ๋ฅ ๊ฐ์ : 114
์๋ถ๋ฅ ๊ฐ์ : 871
๐โ๏ธ ๋๊ฐ ์ฑ์๋ฃ๊ธฐ
# brand_name, category_name, itme_desription ์นผ๋ผ์ Null ๊ฐ์ Other Null ๋ก ์ฑ์ฐ๊ธฐ
s.brand_name = s.brand_name.fillna(value='Other_Null')
s.category_name = s.category_name.fillna(value='Other_Null')
s.item_description = s.item_description.fillna(value='Other_Null')
2๏ธโฃ ํผ์ฒ ์ธ์ฝ๋ฉ , ํผ์ฒ ๋ฒกํฐํ
โพ ์ ํ ํ๊ท์ ๊ฒฝ์ฐ ์ ํซ ์ธ์ฝ๋ฉ ์ ์ฉ์ด ํจ์ฌ ์ ํธ๋๋ค ๐ ์ธ์ฝ๋ฉํ ํผ์ฒ๋ ๋ชจ๋ ์ํซ์ธ์ฝ๋ฉ ์ ์ฉํ๊ธฐ
โพ ํผ์ฒ๋ฒกํฐํ๋ ์งง์ ํ ์คํธ์ ๊ฒฝ์ฐ Count ๊ธฐ๋ฐ์ ๋ฒกํฐํ, ๊ธด ํ ์คํธ๋ TF-IDF ๊ธฐ๋ฐ์ ๋ฒกํฐํ๋ฅผ ์ ์ฉ
1๏ธโฃ brand_name ์ํ์ ๋ธ๋๋๋ช
: 4810 ๊ฐ์ ์ ํ์ด๋, ๋น๊ต์ ๋ช
๋ฃํ ๋ฌธ์์ด๋ก ๋์ด ์์ผ๋ฏ๋ก ๋ณ๋์ ํผ์ฒ ๋ฒกํฐํ ์์ด ์ธ์ฝ๋ฉ ๋ณํ์ ์ ์ฉํ๊ธฐ
2๏ธโฃ name ์ํ๋ช
: ๊ฑฐ์ ๊ฐ๋ณ์ ์ธ ๊ณ ์ ํ ์ํ๋ช
์ ๊ฐ์ง๊ณ ์์ , ์ ์ ๋จ์ด ์์ฃผ์ ํ
์คํธ ํํ ๐ Count ๊ธฐ๋ฐ ํผ์ฒ ๋ฒกํฐํ ๋ณํ ์ ์ฉํ๊ธฐ
3๏ธโฃ category_name : ๋์ค์ ๋ถ๋ฅ ์ธ ๊ฐ์ ์นผ๋ผ์ผ๋ก ๋ถ๋ฆฌ๋์๋๋ฐ, ๊ฐ ์นผ๋ผ๋ณ๋ก ์ํซ์ธ์ฝ๋ฉ ์ ์ฉํ๊ธฐ
4๏ธโฃ shipping , item_condition_id ๋ ์นผ๋ผ ๋ชจ๋ ์ ํ๊ฐ์ ๊ฒฝ์ฐ๊ฐ 2๊ฐ, 5๊ฐ๋ก ์ ์ผ๋ฏ๋ก ์ํซ์ธ์ฝ๋ฉ ์ํ
5๏ธโฃ item_description : ํ๊ท ๋ฌธ์์ด ํฌ๊ธฐ๊ฐ 145๋ก ๋น๊ต์ ํฌ๋ฏ๋ก Tfidf ๋ฒกํฐํํ๊ธฐ
๐โ๏ธ ํผ์ฒ ๋ฒกํฐํ
cnt_vect = CountVectorizer()
X_name = cnt_vect.fit_transform(s.name)
tfidf = TfidfVectorizer(max_features = 50000, ngram_range = (1,3), stop_words = 'english')
X_descp = tfidf.fit_transform(s.item_description)
print(X_name.shape) # ํฌ์ํ๋ ฌ : (1482535, 105757)
print(X_descp.shape) # ํฌ์ํ๋ ฌ : (1482535, 50000)
๐โ๏ธ ํผ์ฒ ์ธ์ฝ๋ฉ : LabelBinarizer ์ํซ์ธ์ฝ๋ฉ์ ์ด์ฉํด ํฌ์ํ๋ ฌ ํํ์ ์ํซ์ธ์ฝ๋ฉ ๋์ถ
# ๐ ๋ชจ๋ ์ธ์ฝ๋ฉ ๋์ ์นผ๋ผ์ LabelBinarizer ๋ฅผ ์ด์ฉํด ํฌ์ํ๋ ฌ ํํ์ ์ํซ์ธ์ฝ๋ฉ์ผ๋ก ๋ณํํ๊ธฐ : sparse_output = True
from sklearn.preprocessing import LabelBinarizer
# brand_name, item_condition_id, shipping ํผ์ฒ๋ค์ ํฌ์ํ๋ ฌ ์ํซ์ธ์ฝ๋ฉ์ผ๋ก ๋ณํ
lb_brand_name = LabelBinarizer(sparse_output = True)
X_band = lb_brand_name.fit_transform(s.brand_name)
lb_item_cond_id = LabelBinarizer(sparse_output = True)
X_item_cond_id = lb_item_cond_id.fit_transform(s.item_condition_id)
lb_shipping = LabelBinarizer(sparse_output = True)
X_shipping = lb_shipping.fit_transform(s.shipping)
# ๋์ค์ ํผ์ฒ๋ค์ ํฌ์ํ๋ ฌ ์ํซ์ธ์ฝ๋ฉ์ผ๋ก ๋ณํ
lb_cat_dae = LabelBinarizer(sparse_output = True)
X_cat_dae = lb_cat_dae.fit_transform(s.cat_dae)
lb_cat_so = LabelBinarizer(sparse_output = True)
X_cat_so = lb_cat_so.fit_transform(s.cat_so)
lb_cat_jung = LabelBinarizer(sparse_output = True)
X_cat_jung = lb_cat_jung.fit_transform(s.cat_jung)
print(type(X_band)) # csr_matrix ํ์
print('X_brand shape : ', X_band.shape) # ์ธ์ฝ๋ฉ ์นผ๋ผ์ด ๋ฌด๋ ค 4810 ๊ฐ ์ด์ง๋ง, ํผ์ฒ ๋ฒกํฐํ๋ก ํ
์คํธ ํํ์ ๋ฌธ์์ด์ด ๊ฐ์ง๋ ๋ฒกํฐ ํํ์ ๋งค์ฐ ๋ง์ ์นผ๋ผ๊ณผ ํจ๊ป ๊ฒฐํฉ๋๋ฏ๋ก ํฌ๊ฒ ๋ฌธ์ ๋ ๊ฒ์ ์์
<class 'scipy.sparse.csr.csr_matrix'>
X_brand shape : (1482535, 4810)
X_name + X_descp + (์ํซ์ธ์ฝ๋ฉ ํผ์ฒ๋ค์ ํฌ์ ํ๋ ฌ๋ก ๋ณํ ํ ํผ์ฒ ๋ฒกํฐํ๋ ํฌ์ ํ๋ ฌ๋ค) ๊ฒฐํฉํ๊ธฐ! ๐ hstack()
๐โ๏ธ ํ๋์ feature ํ๋ ฌ X ๋์ถํ๊ธฐ
from scipy.sparse import hstack
import gc
sparse_matrix_list = (X_name, X_descp, X_band, X_item_cond_id, X_shipping, X_cat_dae, X_cat_jung, X_cat_so)
X_features_sparse = hstack(sparse_matrix_list).tocsr()
print(type(X_features_sparse), X_features_sparse.shape)
<class 'scipy.sparse.csr.csr_matrix'> (1482535, 161569)
3๏ธโฃ ํ๊ท ๋ชจ๋ธ๋ง
ํ๊ฐ์งํ : RMSLE
def rmsle(y , y_pred):
# underflow, overflow๋ฅผ ๋ง๊ธฐ ์ํด log๊ฐ ์๋ log1p๋ก rmsle ๊ณ์ฐ
return np.sqrt(np.mean(np.power(np.log1p(y) - np.log1p(y_pred), 2)))
def evaluate_org_price(y_test , preds):
# ์๋ณธ ๋ฐ์ดํฐ๋ log1p๋ก ๋ณํ๋์์ผ๋ฏ๋ก exmpm1์ผ๋ก ์๋ณต ํ์.
preds_exmpm = np.expm1(preds)
y_test_exmpm = np.expm1(y_test)
# rmsle๋ก RMSLE ๊ฐ ์ถ์ถ
rmsle_result = rmsle(y_test_exmpm, preds_exmpm)
return rmsle_result
import gc
from scipy.sparse import hstack
def model_train_predict(model,matrix_list):
# scipy.sparse ๋ชจ๋์ hstack ์ ์ด์ฉํ์ฌ sparse matrix ๊ฒฐํฉ
X= hstack(matrix_list).tocsr() #โญ
X_train, X_test, y_train, y_test=train_test_split(X, s['price'],
test_size=0.2, random_state=156)
# ๋ชจ๋ธ ํ์ต ๋ฐ ์์ธก
model.fit(X_train , y_train)
preds = model.predict(X_test)
del X , X_train , X_test , y_train
gc.collect()
return preds , y_test
๐โ๏ธ ๋ฆฟ์งํ๊ท
linear_model = Ridge(solver = "lsqr", fit_intercept=False)
sparse_matrix_list = (X_name, X_band, X_item_cond_id,
X_shipping, X_cat_dae, X_cat_jung, X_cat_so)
linear_preds , y_test = model_train_predict(model=linear_model ,matrix_list=sparse_matrix_list)
print('Item Description์ ์ ์ธํ์ ๋ rmsle ๊ฐ:', evaluate_org_price(y_test , linear_preds))
sparse_matrix_list = (X_descp, X_name, X_band, X_item_cond_id,
X_shipping, X_cat_dae, X_cat_jung, X_cat_so)
linear_preds , y_test = model_train_predict(model=linear_model , matrix_list=sparse_matrix_list)
print('Item Description์ ํฌํจํ rmsle ๊ฐ:', evaluate_org_price(y_test ,linear_preds))
Item Description์ ์ ์ธํ์ ๋ rmsle ๊ฐ: 0.5023727038010544
Item Description์ ํฌํจํ rmsle ๊ฐ: 0.4712195143433641
โญ ํฌํจํ์ ๋ rmsle ๊ฐ์ด ๋ง์ด ๊ฐ์ ๐ ์ํฅ์ด ์ค์ํจ
- (์ํ์๊ฐ์ด ๊ธธ์ด์ ํจ์คํ์ง๋ง) LightGBM ์ rmsle ๋ 0.455, ๋ ๋ชจ๋ธ์ ์์๋ธ( lgbm ๊ฒฐ๊ณผ๊ฐ์ 0.45๋ฅผ ๊ณฑํ๊ณ ์ ํ๋ชจ๋ธ์ 0.55๋ฅผ ๊ณฑํจ) ํ์ฌ ๊ตฌํ ๊ฒฐ๊ณผ๋ 0.450์ผ๋ก ๋์ถ
'1๏ธโฃ AIโขDS > ๐ NLP' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[cs224n] 12๊ฐ ๋ด์ฉ์ ๋ฆฌ (0) | 2022.05.23 |
---|---|
[cs224n] 11๊ฐ ๋ด์ฉ ์ ๋ฆฌ (0) | 2022.05.19 |
ํ ์คํธ ๋ถ์ โ (0) | 2022.05.14 |
[cs224n] 10๊ฐ ๋ด์ฉ ์ ๋ฆฌ (0) | 2022.05.13 |
[cs224n] 9๊ฐ ๋ด์ฉ ์ ๋ฆฌ (0) | 2022.05.09 |
๋๊ธ