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からの変換はこれを見つけた
こうしたらいいよとかあったら是非教えてください