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

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

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

```py
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のデータの形は特殊。実際に使う時は、この形に加工する必要がある

```py
y, x = svm_read_problem('news20.txt')
```
train→predictする

```py
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からの変換はこれを見つけた

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