Sekarang, akan dianalisis hasil dari eksperimen besar yang menggunakan unigram sebagai fiturnya, dengan metode txt_comp_dist dan distance metric correlation. Untuk setiap setting eksperimen, dilakukan 30 iterasi.

Import tools yang dibutuhkan dan atur agar matplotlib menggambar grafik secara inline.


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

Load hasil eksperimen dan tampilkan hasilnya.


In [2]:
df = pd.read_hdf('../reports/large-exp-uni-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 unigram all correlation bbs152930 bbs57549 0.909091 0.090909 0.600000 0.400000 0.727273 0.272727 0.000000 1.000000 0.545455 0.454545 ... 0.058722 0.004517 0.000143 0.000001 0.000000 0.000000 0.000000 0.233333 0.766667 0.000000
mus10142 0.909091 0.090909 0.800000 0.200000 0.727273 0.272727 0.000000 1.000000 0.545455 0.454545 ... 0.058722 0.004517 0.000143 0.000001 0.000000 0.000000 0.000000 0.000000 0.700000 0.300000
phy40008 0.909091 0.090909 0.400000 0.600000 0.727273 0.272727 0.000000 1.000000 0.545455 0.454545 ... 0.058722 0.004517 0.000143 0.000001 0.000000 0.000000 0.000000 0.000000 0.600000 0.400000
phy17301 bbs57549 0.909091 0.090909 0.200000 0.800000 0.727273 0.272727 0.000000 1.000000 0.545455 0.454545 ... 0.058722 0.004517 0.000143 0.000001 0.000000 0.000000 0.000000 0.033333 0.300000 0.666667
mus10142 0.909091 0.090909 0.600000 0.400000 0.727273 0.272727 0.000000 1.000000 0.545455 0.454545 ... 0.058722 0.004517 0.000143 0.000001 0.000000 0.000000 0.133333 0.233333 0.433333 0.200000
phy40008 0.909091 0.090909 0.300000 0.700000 0.727273 0.272727 0.033333 0.966667 0.545455 0.454545 ... 0.058722 0.004517 0.000143 0.000001 0.033333 0.166667 0.300000 0.400000 0.100000 0.000000
mus1139 bbs57549 0.909091 0.090909 0.300000 0.700000 0.727273 0.272727 0.000000 1.000000 0.545455 0.454545 ... 0.058722 0.004517 0.000143 0.000001 0.033333 0.266667 0.200000 0.266667 0.133333 0.100000
mus10142 0.909091 0.090909 0.900000 0.100000 0.727273 0.272727 0.433333 0.566667 0.545455 0.454545 ... 0.058722 0.004517 0.000143 0.000001 0.433333 0.466667 0.100000 0.000000 0.000000 0.000000
phy40008 0.909091 0.090909 0.233333 0.766667 0.727273 0.272727 0.000000 1.000000 0.545455 0.454545 ... 0.058722 0.004517 0.000143 0.000001 0.233333 0.400000 0.100000 0.200000 0.066667 0.000000

9 rows × 116 columns

Hitung rata-rata hasil terhadap seluruh dataset.


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.481481
1 0.090909 0.518519
3 0 0.727273 0.051852
1 0.272727 0.948148
5 0 0.545455 0.044444
1 0.454545 0.955556
4 1 0 0.714286 0.359259
1 0.285714 0.640741
3 0 0.329670 0.022222
1 0.494505 0.237037
2 0.164835 0.637037
3 0.010989 0.103704
5 0 0.125874 0.000000
1 0.419580 0.066667
2 0.359640 0.159259
3 0.089910 0.522222
4 0.004995 0.251852
8 1 0 0.555556 0.481481
1 0.444444 0.518519
3 0 0.147059 0.007407
1 0.441176 0.266667
2 0.343137 0.585185
3 0.068627 0.140741
5 0 0.029412 0.000000
1 0.196078 0.066667
2 0.392157 0.133333
3 0.294118 0.381481
4 0.081699 0.388889
5 0.006536 0.029630
80 1 1 0 0.987654 0.496296
1 0.012346 0.503704
3 0 0.962963 0.322222
1 0.037037 0.677778
5 0 0.938272 0.300000
1 0.061728 0.700000
4 1 0 0.952381 0.207407
1 0.047619 0.792593
3 0 0.862264 0.140741
1 0.132656 0.214815
2 0.005038 0.370370
3 0.000042 0.274074
5 0 0.778699 0.107407
1 0.204921 0.162963
2 0.015968 0.214815
3 0.000409 0.270370
4 0.000003 0.244444
8 1 0 0.909091 0.192593
1 0.090909 0.807407
3 0 0.748706 0.085185
1 0.230371 0.129630
2 0.020413 0.329630
3 0.000510 0.455556
5 0 0.613645 0.081481
1 0.322971 0.144444
2 0.058722 0.092593
3 0.004517 0.151852
4 0.000143 0.344444
5 0.000001 0.185185

Sedikit penjelasan, k menyatakan banyaknya OOT posts yang terambil pada top list.

Agar lebih jelas, hasil pada tabel di atas akan disajikan dalam bentuk grafik. Pada grafik di bawah ini, 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', legend=False, use_index=False, ylim=(0.,1.), title='num_norm={}, num_oot={}, num_top={}'.format(*name))


Dapat dilihat dari grafik di atas bahwa hasil eksperimen jauh lebih baik ketimbang baseline. Untuk lebih jelasnya lagi, akan lebih mudah apabila kita dapat menyatakan setiap distribusi/histogram dalam satu buah angka pengukuran. Untuk keperluan ini, angka pengukuran yang akan digunakan adalah expected value/rata-rata.


In [7]:
ngroup = len(grouped)
data = np.empty((ngroup, 2))
index = []
for i, (name, _) in enumerate(grouped):
    tmp = df_agg.loc[name]
    prod = tmp.T * np.array(tmp.index)   # multiply pmf and support
    expval = prod.sum(axis=1)
    data[i, :] = expval.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.518519
3 0.272727 0.948148
5 0.454545 0.955556
4 1 0.285714 0.640741
3 0.857143 1.822222
5 1.428571 2.959259
8 1 0.444444 0.518519
3 1.333333 1.859259
5 2.222222 3.181481
80 1 1 0.012346 0.503704
3 0.037037 0.677778
5 0.061728 0.700000
4 1 0.047619 0.792593
3 0.142857 1.777778
5 0.238095 2.381481
8 1 0.090909 0.807407
3 0.272727 2.155556
5 0.454545 3.088889

Tabel di atas menunjukkan expected value baseline dan hasil eksperimen dengan metode txt_comp_dist untuk masing-masing kejadian acak. Terlihat bahwa hasil eksperimen dengan metode txt_comp_dist jauh mengungguli baseline.