Kali ini, akan dianalisis hasil dari eksperimen besar dengan menggunakan fitur readability, metode txt_comp_dist, dan distance metric correlation. Dilakukan 30 iterasi untuk setiap setting eksperimen.

Pertama-tama, import tools yang dibutuhkan dan atur agar matplotlib menggambar grafik secara inline.


In [1]:
import numpy as np
import pandas as pd
%matplotlib inline

Load hasil eksperimen dan tampilkan hasilnya.


In [2]:
df = pd.read_hdf('../reports/large-exp-rea-feat-corr-dist.h5', 'df')

In [3]:
df


Out[3]:
num_norm 10 ... 80
num_oot 1 ... 8
num_top 1 3 5 ... 5
result base perf base perf base ... base perf
k 0 1 0 1 0 1 0 1 0 1 ... 2 3 4 5 0 1 2 3 4 5
method feature max_features metric norm_dir oot_dir
txt_comp_dist readability all correlation bbs152930 bbs57549 0.909091 0.090909 0.966667 0.033333 0.727273 0.272727 0.700000 0.300000 0.545455 0.454545 ... 0.058722 0.004517 0.000143 0.000001 0.833333 0.133333 0.033333 0 0 0
mus10142 0.909091 0.090909 1.000000 0.000000 0.727273 0.272727 0.400000 0.600000 0.545455 0.454545 ... 0.058722 0.004517 0.000143 0.000001 1.000000 0.000000 0.000000 0 0 0
phy40008 0.909091 0.090909 0.966667 0.033333 0.727273 0.272727 0.633333 0.366667 0.545455 0.454545 ... 0.058722 0.004517 0.000143 0.000001 0.933333 0.066667 0.000000 0 0 0
phy17301 bbs57549 0.909091 0.090909 0.966667 0.033333 0.727273 0.272727 0.700000 0.300000 0.545455 0.454545 ... 0.058722 0.004517 0.000143 0.000001 0.700000 0.300000 0.000000 0 0 0
mus10142 0.909091 0.090909 1.000000 0.000000 0.727273 0.272727 0.566667 0.433333 0.545455 0.454545 ... 0.058722 0.004517 0.000143 0.000001 1.000000 0.000000 0.000000 0 0 0
phy40008 0.909091 0.090909 0.966667 0.033333 0.727273 0.272727 0.766667 0.233333 0.545455 0.454545 ... 0.058722 0.004517 0.000143 0.000001 0.800000 0.166667 0.033333 0 0 0
mus1139 bbs57549 0.909091 0.090909 0.933333 0.066667 0.727273 0.272727 0.900000 0.100000 0.545455 0.454545 ... 0.058722 0.004517 0.000143 0.000001 0.733333 0.233333 0.033333 0 0 0
mus10142 0.909091 0.090909 0.933333 0.066667 0.727273 0.272727 0.800000 0.200000 0.545455 0.454545 ... 0.058722 0.004517 0.000143 0.000001 1.000000 0.000000 0.000000 0 0 0
phy40008 0.909091 0.090909 0.966667 0.033333 0.727273 0.272727 0.966667 0.033333 0.545455 0.454545 ... 0.058722 0.004517 0.000143 0.000001 0.766667 0.233333 0.000000 0 0 0

9 rows × 116 columns

Selanjutnya, lakukan agregasi dengan merata-ratakan hasil terhadap seluruh pasangan thread yang digunakan.


In [4]:
df_agg = df.mean(axis=0).unstack(level='result')

In [5]:
df_agg


Out[5]:
result base perf
num_norm num_oot num_top k
10 1 1 0 0.909091 0.966667
1 0.090909 0.033333
3 0 0.727273 0.714815
1 0.272727 0.285185
5 0 0.545455 0.548148
1 0.454545 0.451852
4 1 0 0.714286 0.929630
1 0.285714 0.070370
3 0 0.329670 0.370370
1 0.494505 0.562963
2 0.164835 0.066667
3 0.010989 0.000000
5 0 0.125874 0.140741
1 0.419580 0.377778
2 0.359640 0.414815
3 0.089910 0.066667
4 0.004995 0.000000
8 1 0 0.555556 0.711111
1 0.444444 0.288889
3 0 0.147059 0.207407
1 0.441176 0.633333
2 0.343137 0.151852
3 0.068627 0.007407
5 0 0.029412 0.029630
1 0.196078 0.233333
2 0.392157 0.444444
3 0.294118 0.270370
4 0.081699 0.022222
5 0.006536 0.000000
80 1 1 0 0.987654 0.996296
1 0.012346 0.003704
3 0 0.962963 0.988889
1 0.037037 0.011111
5 0 0.938272 0.985185
1 0.061728 0.014815
4 1 0 0.952381 0.970370
1 0.047619 0.029630
3 0 0.862264 0.962963
1 0.132656 0.037037
2 0.005038 0.000000
3 0.000042 0.000000
5 0 0.778699 0.918519
1 0.204921 0.077778
2 0.015968 0.003704
3 0.000409 0.000000
4 0.000003 0.000000
8 1 0 0.909091 0.951852
1 0.090909 0.048148
3 0 0.748706 0.892593
1 0.230371 0.100000
2 0.020413 0.007407
3 0.000510 0.000000
5 0 0.613645 0.862963
1 0.322971 0.125926
2 0.058722 0.011111
3 0.004517 0.000000
4 0.000143 0.000000
5 0.000001 0.000000

Agar lebih jelas, akan digambar grafik dari tabel di atas. Pada grafik di bawah, warna biru dan hijau merepresentasikan baseline dan performa metode berturut-turut.


In [6]:
grouped = df_agg.groupby(level=['num_norm','num_oot','num_top'])
for name, group in grouped:
    group.plot(kind='bar', use_index=False, legend=False, ylim=(0.,1.), title='num_norm={}, num_oot={}, num_top={}'.format(*name))


Dari grafik-grafik di atas, cukup terlihat jelas bahwa metode txt_comp_dist dengan fitur readability tidak lebih baik daripada baseline. Untuk lebih jelasnya, akan dihitung expected value-nya.


In [7]:
ngroup = len(grouped)
data = np.empty((ngroup, 2))
index = []
for i, (name, _) in enumerate(grouped):
    df_tmp = df_agg.loc[name]
    prod = df_tmp.T * np.array(df_tmp.index)
    exp_val = prod.sum(axis=1)
    data[i, :] = exp_val.values
    index.append(name)

In [8]:
index = pd.MultiIndex.from_tuples(index, names=['num_norm','num_oot','num_top'])

In [9]:
result = pd.DataFrame(data, index=index, columns=['base','perf'])
result.columns.name = 'E[X]'

In [10]:
result


Out[10]:
E[X] base perf
num_norm num_oot num_top
10 1 1 0.090909 0.033333
3 0.272727 0.285185
5 0.454545 0.451852
4 1 0.285714 0.070370
3 0.857143 0.696296
5 1.428571 1.407407
8 1 0.444444 0.288889
3 1.333333 0.959259
5 2.222222 2.022222
80 1 1 0.012346 0.003704
3 0.037037 0.011111
5 0.061728 0.014815
4 1 0.047619 0.029630
3 0.142857 0.037037
5 0.238095 0.085185
8 1 0.090909 0.048148
3 0.272727 0.114815
5 0.454545 0.148148

Dari tabel ini, terlihat bahwa metode txt_comp_dist dengan fitur readability memang memiliki hasil yang sangat buruk ketimbang baseline.