9
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

liblinearで機械学習を体験してみた

Last updated at Posted at 2016-05-06

liblinearはinstanceや特徴が100万桁のデータを線形分離するための機会学習ライブラリ
  https://www.csie.ntu.edu.tw/~cjlin/liblinear/
特徴としては、素性数が膨大なものを早く処理するできるのが他との違い

とにかくデスクトップに入れて、打ってみる。まずはインポートするものを入れる。
ターミナル (あるいは cmd) を開いてすぐに ipython コマンドを打つのではなく、作業するディレクトリ (フォルダ) まで行ってから ipython を立ち上げる

import sys
sys.path.append('/Users/xxxx/Desktop/liblinear-2.1/python')
from liblinearutil import *
from liblinear import *

使うデータは以下のnews20
https://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/multiclass.html
liblinearのデータの形は特殊。実際に使う時は、この形に加工する必要がある

y, x = svm_read_problem('news20.txt')

train→predictする

In [20]: len(y)
Out[20]: 15935
#15935個データがあるので、5000個までを教師データとして学習させる
m = train(y[:5000], x[:5000])
save_model('news20.model', m)

optimization finished, #iter = 1000

WARNING: reaching max number of iterations
Using -s 2 may be faster (also see FAQ)

Objective value = -38.201637
nSV = 1028
.*
optimization finished, #iter = 17
Objective value = -18.665411
nSV = 903

なんかよくわからないが、学習できたみたい
できたモデルをsaveして、中を見てみる。news20.modelとしてフォルダに生成されている

weight = open('news20.model').readlines()
weight[:10]

['solver_type L2R_L2LOSS_SVC_DUAL\n',
'nr_class 20\n',
'label 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20\n',
'nr_feature 62017\n',
'bias -1\n',
'w\n',
'-0.339495505987624 -0.2729835882642053 -0.1726449590446147 -0.2479101793530862 -0.4274669775000416 -0.2412066297893888 -0.2293917779069297 -0.1540898055174211 -0.215426735582579 -0.2955027766952972 -0.07665514316560521 -0.2067955978156952 -0.2129682323900661 -0.3178416173675406 -0.1100450398128613 -0.1089058297966 0.2118441015471185 -0.1789025390838444 -0.2308991526979358 -0.3216302447541755 \n',
'0.03464116990799743 0.03296276686709169 -0.005516289618528965 0 0 8.487270131488089e-19 -0.03693284638681263 0 0 0 -0.0005436471560843025 0 4.336808689942018e-19 0 0 0 -1.355252715606881e-20 0.005881877772996123 0.0004078249397363432 -0.005592803559260878 \n',
'0 0 0 0 -0.006337527074141217 0 -0.01043809306013021 -0.02848401075118318 -0.02192217208113558 0 -0.002743696876587976 -0.002823046244597745 5.421010862427522e-19 0 -0.01184141317622985 -0.00327656833111874 -0.00300798970221013 0.07620931881353635 0.07709902339068471 -0.007496992406231962 \n',
'0 0.000336438903090087 -0.002105522336459381 -0.003408253600602967 0.04532864192038737 0.00358490636419236 -0.01288493688454648 -0.03829009043077678 -0.02192217208113558 0 -0.002743696876587976 -0.006148372938504376 0.04416917489366715 0 -0.03749035441444219 0.00486249738297638 -0.003188508027714593 0.1323725656877747 0.09645265180639011 -0.01123137774909418 \n']

ラベルが20個あり、それぞれに対しての重みに成っている。
http://qwone.com/~jason/20Newsgroups/ 
のvocabulary.txt がindexになっていいる。これでどの単語が分類に効いているかがわかる

predictする

p_label, p_acc, p_val = predict(y[5000:], x[5000:], m)

Accuracy = 74.3576% (8131/10935) (classification)

精度は74%でまずまず、、、のようだ

予測の結果を見てみる。まずは分かりやすいようにデータフレームに正解y、予測ラベルp_label、各ラベルのスコアp_valを入れる

import pandas as pd
a=pd.DataFrame([y[5000:],p_label,p_val])
a[0]
a[0][2]

0 1
1 1
2 [-0.434941406833, -2.4992939688, -1.9156773889...
Name: 0, dtype: object

[-0.43494140683299093,
-2.499293968803961,
-1.9156773889387406,
-1.652996684855934,
-0.64663025115734,
-1.981531321375946,
-2.0506304515990794,
-1.9845217707935987,
-1.816531448715213,
-1.9993917151454117,
-2.6192052686130403,
-2.375782174561902,
-2.1841316767499994,
-2.787946449405093,
-1.981463462884227,
-2.4769599630955956,
-1.3508140247538216,
-1.7235783924583472,
-1.7785165908522975,
-2.2096245620379604]

1が最も近く、正解データと同じになっている

どんぐらいあっているのか見てみる

b=pd.DataFrame([y[5000:],p_label])
b

0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9 10
1 1 2 2 4 5 7 4 8 9 4

... 10925 10926 10927 10928 10929 10930 10931 10932 10933 10934
0 ... 18 19 7 9 15 16 17 18 19 17
1 ... 18 18 7 9 15 16 17 15 19 17

まあまあ分類できていそう

ちなみにパラメータはよく分からないない、、、
そして、問題はこのデータの方をどう作るか、、、

https://github.com/zygmuntz/phraug
https://github.com/zygmuntz/phraug/blob/master/csv2libsvm.py
CSVからの変換はこれを見つけた

こうしたらいいよとかあったら是非教えてください

9
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?