목표

  • 상품의 이름만으로 ['가전/디지털', '식품/건강', '화장품/이미용'] 3개의 카테고리를 분류해본다
  • Linear SVC 모델을 활용한다.

In [1]:
cate_list = ['가전·디지털', '식품·건강', '화장품·이미용']

학습데이터 준비


In [2]:
import pandas as pd

In [3]:
df = pd.read_csv('clf.csv', index_col='name')

In [4]:
df[df.cate1==cate_list[0]][1:3]


Out[4]:
id price cate1
name
미고머스트해브레깅스 5+1 / 본구성:기모치마레깅스 2종(블랙, / 특별구성:사은품: 기모레깅스(브라운 375 38800 가전·디지털
2014년형 헬스믹 프로 284 153070 가전·디지털

In [5]:
df[df.cate1==cate_list[1]][1:3]


Out[5]:
id price cate1
name
닥터슈퍼칸 12박스/12개월 782 164570 식품·건강
정관장 홍삼활력 PLUS 7박스/7개월 631 327000 식품·건강

In [6]:
df[df.cate1==cate_list[2]][1:3]


Out[6]:
id price cate1
name
[조성아 22 (CHOSUNGAH TWENTYTWO)] [조성아22] 바운스업팩트 마스터 본품 2개 + 리필 2개 + 리얼췩 스무더 1종 + 무료체험분 + 유니레버 바세린 보습 2종! 롯데단독패키지 1230 78900 화장품·이미용
전인화 고유에 기초세트 1267 149000 화장품·이미용

자연어 데이터를 벡터형태로 가공

  • sklearn.CountVectorizer 사용
  • 유니그램을 이용

In [7]:
from sklearn.feature_extraction.text import CountVectorizer

In [8]:
vectorizer = CountVectorizer(min_df=1, tokenizer=lambda x: list(x))

In [9]:
corpus = [name.decode('utf-8') for name in df.index]
print corpus[0]


[특별구성]아마조니아 아사이베리 50gX13팩+쇼핑백 2장

In [10]:
analyze = vectorizer.build_analyzer()

In [11]:
analyze(u'삼육 두유')


Out[11]:
[u'\uc0bc', u'\uc721', u' ', u'\ub450', u'\uc720']

학습데이터 변환


In [12]:
X = vectorizer.fit_transform(corpus)

In [13]:
for el in cate_list:
    print el


가전·디지털
식품·건강
화장품·이미용

In [14]:
for el in df.cate1[:3].tolist():
    print el


식품·건강
식품·건강
식품·건강

In [15]:
Y = map(cate_list.index, df.cate1.tolist())

In [16]:
print X.shape[0], len(Y)


1500 1500

모델 학습


In [17]:
from sklearn.svm import LinearSVC

In [18]:
clf = LinearSVC(C=1.0)

In [19]:
clf.fit(X[:-200], Y[:-200])


Out[19]:
LinearSVC(C=1.0, class_weight=None, dual=True, fit_intercept=True,
     intercept_scaling=1, loss='l2', multi_class='ovr', penalty='l2',
     random_state=None, tol=0.0001, verbose=0)

모델 평가

  • accuracy_score 를 이용하여 학습데이터와 정답을 비교

In [20]:
from sklearn.metrics import accuracy_score

In [21]:
P = clf.predict(X[-200:])
print accuracy_score(Y[-200:], P) * 100


92.5

In [22]:
print cate_list[clf.predict(vectorizer.transform([u'자동 물걸레 청소기']))[0]]


가전·디지털

In [23]:
print cate_list[clf.predict(vectorizer.transform([u'에센스 커버 팩트 리미티드 패키지']))[0]]


화장품·이미용

In [24]:
print cate_list[clf.predict(vectorizer.transform([u'야생 블루베리 무려 10박스']))[0]]


식품·건강