naaraat < read.table('http://cs.joensuu.fi/pages/whamalai/dm13/naaraatvalikoitu.csv', head=t, sep=',') printf < function(...) { print(sprintf(...)) c_by_method < NULL # Listataan ne muuttujaparit, joilla jokin korrelaatio on itseisarvoltaan >= 0.4. for (m in c('pearson', 'kendall', 'spearman')) { printf('method: %s', m) printf(' ') c < cor(naaraat, method = m) c_by_method[[m]] < as.matrix(c) for (i in 1:(length(c[1,]) 1)) { for (j in ((i+1):length(c[,1]))) { if(abs(c[i,j]) >= 0.4) { printf("%s vs. %s: %f", names(c[1,])[i], names(c[,1])[j], c[i,j]) printf('') # Koostetaan muuttujaparikohtaisten korrelaatiokertoimien eroista MSE:t, jolloin erikoisimmat poikkeamat on helppo löytää. c_avg < as.matrix( c_by_method[['kendall']] + c_by_method[['pearson']] + c_by_method[['spearman']] ) / 3 mse < ((c_by_method[['kendall']] c_avg) ** 2 + (c_by_method[['pearson']] c_avg) ** 2 + (c_by_method[['spearman']] c_avg) ** 2) / 3 mse > 0.34 * max(mse) # Toisistaan poikkeavimpia korrelaatiokertoimia saavat X4 X5, X4 X6, X4 X8, X5 X6 ja X6 X8. for(i in list(c(4,5), c(4,6), c(4,8), c(5,6), c(6,8))) { printf('%s %s', names(c[1,])[i[1]], names(c[,1])[i[2]]) for(m in c('pearson', 'kendall', 'spearman')) { printf(' %s: %f', m, c_by_method[[m]][i[1],i[2]]) # Näille muuttujapareille yhteistä on se, että Pearsonin korrelaatiokerroin on suurin, kun taas Kendallin ja Spearmanin kertoimet ovat samalla tasolla. # Tähän eräs ilmeinen syy on se, että Pearsonin korrelaatiokerroin on herkkä outliereille. # Jännimmältä vaikuttavat arvojen perusteella parit X4 X8 ja X4 X6 (kendall ja spearman negatiivisia), piirrelläänpä ainakin ne.. plot(naaraat[,4], naaraat[,8]) #Yksi outlier. plot(naaraat[,4], naaraat[,6]) #Näemmä pari selvää outlieria. plot(naaraat[,4], naaraat[,6]) #Näemmä pari selvää outlieria. plot(naaraat[,5], naaraat[,6]) #Muutama outlier. plot(naaraat[,6], naaraat[,8]) #Pari outlieriä.
#b kohta # Valitaan jokin sopiva raja arvo, joka tuottaa riittävästi mielenkiintoisia pareja. sum(mse < 0.0004 * max(mse)) # = 25 (diagonaalialkiot + 3 muuttujaparia) mse < 0.0004 * max(mse) # Tarkasteltavia pareja 1 5, 13 19 ja 14 18. plot(naaraat[,1], naaraat[,5]) plot(naaraat[,13], naaraat[,19]) plot(naaraat[,14], naaraat[,18]) # Tarkasteltujen muuttujien nimet: names(naaraat)[c(1,5,13,14,18,19)] #1 ja 19 eivät ole edes järjestysmuuttujia. # Näissä muuttujapareissa toinen muuttujista on selvästi luokitteleva ja toinen jatkuvaluonteinen. c_by_method[['pearson']][mse < 0.004 * max(mse)] #Pearsonin korrelaatiokertoimet niiden muuttujaparien osalta, joissa eri korrelaatiokerrointyypit eivät liiemmin poikkea toisistaan. # Havaitaan siis, että juuri näissä muuttujapareissa ei ole liiemmin korrelaatiotakaan (1.000 korrelaatiot ovat diagonaalialkiolta eli muuttujan korrelaatio itsensä kanssa, joka ei luonnollisestikaan meitä kiinnosta). ################################################################################ [1] "Method: pearson" [1] " " [1] "X1.vaika X13.batratio: 0.435682" [1] "X2.paino X7.thymusratio: 0.672252" [1] "X2.paino X9.neitsyt: 0.631371" [1] "X2.paino X10.rasitus: 0.538190" [1] "X2.paino X15.hanta: 0.840479" [1] "X2.paino X17.vart: 0.860995" [1] "X2.paino X18.painoind: 0.978825" [1] "X4.maksaratio X5.pernaratio: 0.544861" [1] "X4.maksaratio X6.sydanratio: 0.438972" [1] "X4.maksaratio X8.umpisratio: 0.583693" [1] "X5.pernaratio X6.sydanratio: 0.413823" [1] "X5.pernaratio X7.thymusratio: 0.461345" [1] "X6.sydanratio X7.thymusratio: 0.419244" [1] "X6.sydanratio X18.painoind: 0.415997" [1] "X7.thymusratio X9.neitsyt: 0.498809" [1] "X7.thymusratio X13.batratio: 0.466414" [1] "X7.thymusratio X15.hanta: 0.584725" [1] "X7.thymusratio X17.vart: 0.640737" [1] "X7.thymusratio X18.painoind: 0.659174" [1] "X9.neitsyt X10.rasitus: 0.730178" [1] "X9.neitsyt X15.hanta: 0.588542"
[1] "X9.neitsyt X17.vart: 0.583704" [1] "X9.neitsyt X18.painoind: 0.625617" [1] "X10.rasitus X15.hanta: 0.463264" [1] "X10.rasitus X17.vart: 0.449783" [1] "X10.rasitus X18.painoind: 0.542028" [1] "X11.gonratio X12.uusrasvaratio: 0.783236" [1] "X15.hanta X17.vart: 0.837446" [1] "X15.hanta X18.painoind: 0.819489" [1] "X17.vart X18.painoind: 0.773764" [1] "" [1] "Method: kendall" [1] " " [1] "X2.paino X7.thymusratio: 0.465082" [1] "X2.paino X9.neitsyt: 0.507948" [1] "X2.paino X10.rasitus: 0.440744" [1] "X2.paino X15.hanta: 0.659591" [1] "X2.paino X17.vart: 0.683527" [1] "X2.paino X18.painoind: 0.877423" [1] "X7.thymusratio X9.neitsyt: 0.435545" [1] "X7.thymusratio X15.hanta: 0.414413" [1] "X7.thymusratio X17.vart: 0.438647" [1] "X7.thymusratio X18.painoind: 0.446665" [1] "X9.neitsyt X10.rasitus: 0.720089" [1] "X9.neitsyt X15.hanta: 0.465024" [1] "X9.neitsyt X17.vart: 0.455947" [1] "X9.neitsyt X18.painoind: 0.511628" [1] "X10.rasitus X18.painoind: 0.452043" [1] "X11.gonratio X12.uusrasvaratio: 0.701713" [1] "X15.hanta X17.vart: 0.585338" [1] "X15.hanta X18.painoind: 0.622890" [1] "X17.vart X18.painoind: 0.555258" [1] "" [1] "Method: spearman" [1] " " [1] "X1.vaika X13.batratio: 0.431127" [1] "X2.paino X7.thymusratio: 0.652295" [1] "X2.paino X9.neitsyt: 0.620144" [1] "X2.paino X10.rasitus: 0.558903" [1] "X2.paino X15.hanta: 0.825739" [1] "X2.paino X17.vart: 0.838653" [1] "X2.paino X18.painoind: 0.977993" [1] "X6.sydanratio X10.rasitus: 0.403958" [1] "X6.sydanratio X18.painoind: 0.412165" [1] "X7.thymusratio X9.neitsyt: 0.532280" [1] "X7.thymusratio X10.rasitus: 0.406026" [1] "X7.thymusratio X15.hanta: 0.577959"
[1] "X7.thymusratio X17.vart: 0.604705" [1] "X7.thymusratio X18.painoind: 0.628491" [1] "X9.neitsyt X10.rasitus: 0.760027" [1] "X9.neitsyt X15.hanta: 0.559221" [1] "X9.neitsyt X17.vart: 0.541990" [1] "X9.neitsyt X18.painoind: 0.625139" [1] "X10.rasitus X15.hanta: 0.464712" [1] "X10.rasitus X17.vart: 0.443642" [1] "X10.rasitus X18.painoind: 0.572761" [1] "X11.gonratio X12.uusrasvaratio: 0.811415" [1] "X15.hanta X17.vart: 0.741243" [1] "X15.hanta X18.painoind: 0.796359" [1] "X17.vart X18.painoind: 0.720242" poikkeavuudet: [1] "X4.maksaratio X5.pernaratio" [1] " pearson: 0.544861" [1] " kendall: 0.178944" [1] " spearman: 0.261405" [1] "X4.maksaratio X6.sydanratio" [1] " pearson: 0.438972" [1] " kendall: 0.070826" [1] " spearman: 0.103988" [1] "X4.maksaratio X8.umpisratio" [1] " pearson: 0.583693" [1] " kendall: 0.176357" [1] " spearman: 0.251261" [1] "X5.pernaratio X6.sydanratio" [1] " pearson: 0.413823" [1] " kendall: 0.060604" [1] " spearman: 0.082895" [1] "X6.sydanratio X8.umpisratio" [1] " pearson: 0.365682" [1] " kendall: 0.026679" [1] " spearman: 0.039949" samankaltaisuudet: > c_by_method[['pearson']][mse < 0.004 * max(mse)] #Pearsonin korrelaatiokertoimet niiden muuttujaparien osalta, joissa eri korrelaatiokerrointyypit eivã t liiemmin poikkea toisistaan.
[1] 1.000000000 0.054850322 0.023685166 0.265659365 0.145417144 0.162898471 [7] 0.003797779 0.075237650 0.054850322 1.000000000 0.006087124 1.000000000 [13] 0.105056526 0.042104693 1.000000000 0.107813033 0.053916229 0.082301968 [19] 0.004186576 0.023685166 1.000000000 0.126852705 1.000000000 1.000000000 [25] 0.051479466 1.000000000 0.081114132 0.265659365 0.107813033 1.000000000 [31] 0.016616646 0.087808834 0.052251551 0.145417144 1.000000000 0.047357631 [37] 0.075434687 0.023343412 1.000000000 0.016616646 0.047357631 1.000000000 [43] 0.051309978 0.034490353 1.000000000 0.058349487 0.032488310 0.009027809 [49] 0.162898471 0.006087124 0.105056526 0.126852705 0.051479466 0.081114132 [55] 0.087808834 0.075434687 0.051309978 0.058349487 1.000000000 0.011444231 [61] 0.086977567 0.036881555 0.264948964 0.053916229 0.011444231 1.000000000 [67] 0.042104693 0.082301968 0.052251551 0.023343412 0.034490353 0.032488310 [73] 1.000000000 0.002825088 0.003797779 0.004186576 0.086977567 1.000000000 [79] 0.075237650 0.036881555 0.002825088 1.000000000 0.009027809 0.264948964 [85] 1.000000000 #muuttujaparit 1 ja 5 sekä 2 ja 8
Siis Correctly Classified Instances arvot ovat a: 78.1955 b(oletus): 73.3083 b(0): 78.9474 b(15): 76.6917 c: 74.812 d: 81.5789 e: 78.1955 f(naiivi): 57.8947 f(naiivi ): 75.9398 f(bayesnet): 68.0451 f(bayesnet ): 74.812 = datasta poistettu painot ja ratiot hantaa ja sydanta lukuunottamatta Huomioita Bayes luokittelija vaikuttaa pärjäävän paremmin useamman muuttujan ollessa jatkuvaluonteisia. Toisaalta Bayes luokittelija hyötyy (valistuneella arvauksella) siistitystä datasta. J48 suoriutuu likimain yhtä hyvin molemmissa tapauksissa. Luulisin jollain valistuneella arvauksella / peukalosäännöllä yhden piilotason neuroverkon kykenevään jopa parempaankin tulokseen kuin ilman piilotasoa. Heikoimmat tulokset diskretoidulla datalla ajettu naiivi Bayes sekä BayesNet. Paras tulos numeerista dataa vasten ajetulla BayesNetillä. Muuten tulokset ovat melko sievästi 70 80 %:n tuntumassa.
$ # Ensinnäkin muutama perustesti. Ensin kaksimuuttujainen data, jossa karteesisen tulon {0,1,2..63 x {0,1,2..63 kaikki alkiot. $ java cp cls Mutuali summary_testi_tas.csv 1 2 mi=2.220446049250313e 16 $ # Kaksimuuttujainen data, jossa laskeva suora (0,0), ( 1,1),.., ( 255,255). $ java cp cls Mutuali summary_testi_ lin.csv 1 2 mi=0.4549558887413734 $ cat summary_testi_ lin.csv #testi_ lin.csv 1, 255.0,0.0,3 2,0.0,255.0,4 $ nano summary_testi_ lin.csv $ cat summary_testi_ lin.csv #testi_ lin.csv 1, 255.0,0.0,4 2,0.0,255.0,4 $ java cp cls Mutuali summary_testi_ lin.csv 1 2 mi=1.0 $ # Vaikuttaisi ilmeisesti toimivan. $ # Nappasinpa kokeiltavaksi hieman kiihtyvyysdataa omasta harjoitustyöaiheesta. Ensimmäinen muuttuja (aika) on luonnollisesti tiputettu pois. $ java cp cls Mutuali summary_implant_axis.csv 3 4 mi=0.38659727185899917 2 3 mi=0.29756426418394666 2 4 mi=0.2477377080995442 $ # Siis mitä ilmeisemmin muuttujien välillä on hieman korrelaatiota, kuten olettaa saattaa. Vähiten keskenään korreloivat x ja z muuttuja.
lehma < read.table('http://cs.joensuu.fi/pages/whamalai/dm13/lehmakiiht.csv', head=t, sep=',') lehma$c < factor(lehma$c) koulutus < 1:1000 #valitaan tuhat riviä koulutusdataksi S < cov(lehma[koulutus, 6]) #kovarianssimatriisi talteen #olettamalla C järjestysmuuttujaksi voidaan lähteä kokeilemaan lineaariregressiomallia y < as.matrix(c(lehma[koulutus,6])) #selitettävä(t) muuttuja(t) x < as.matrix(cbind((rep(1, length(lehma[koulutus,6]))), lehma[koulutus, 6])) #selittävät muuttujat xtemp < solve(t(x) %*% x) %*% t(x) #hirvittävä pns häkkyrä, jollaisia laskettiin liniksessä #näillä voi vähän tutkia, mitä on saatu nyt aikaan #head(xtemp) #str(xtemp) #str(y) #mjaa, kai tarkoitus oli käyttää xtempiä, mutta käyhän se näinkin (regressiomallin mukaiset betakertoimet) betamat < solve(t(x) %*% x) %*% t(x) %*% y #tutkailuja #str(x) #str(y) #PCA: kovarianssimatriisin ominaisarvoja/ vektoreita tarvitaan PCA:han eigs < eigen(s) cumsum(eigs$values / sum(eigs$values)) #pari ekaa pääkomponenttia tuo esille valtaosan eroista #yksittäisten koordinaattien plottailut (vaihda # v tuosta vertailtavia sarakepareja, nykyisellään siis 2. ja 5. sarake luetaan x ja y koordinaateiksi) plot(lehma[koulutus,c(5,2)], col = c('blue', 'red', 'green')[lehma$c]) #PCA: vertailun vuoksi parin ekan pääkomponentin mukaan sovitellut havainnot plot(as.matrix(lehma[koulutus, 6]) %*% eigs$vectors[,1:2], col = c('blue', 'red', 'green')[lehma$c]) #näissähän alkaisi olla jo mahdollisuus karkeasti erotella toiminnot toisistaan #testataanpa jollakin yksittäisellä havainnolla as.matrix(cbind(1, lehma[1444, 6])) %*% betamat # ~1.086 lehma[1444,6] # = 1 #testataanpa loppudatalla kokonaisuudessaan (indeksoinnissa negatiivinen arvo siis meinaa "jätä pois", eli esim. lehma[ koulutus,] valitsee rivit, joita ei käytetty koulutukseen) arvatut < as.matrix(cbind(1, lehma[ koulutus, 6])) %*% betamat oikein < sum((round(arvatut) c(lehma[ koulutus,6])) == 0)
testilehmia < length(lehma[ koulutus,1]) #arvausprosentti: oikein / testilehmia #siis 82,26 % #################### PCA ###################### #huom! eigs laskettu jo edellä y < as.matrix(c(lehma[koulutus,6])) #selitettävä(t) muuttuja(t) x < as.matrix(cbind((rep(1, length(lehma[koulutus,6]))), as.matrix(lehma[koulutus, 6]) %*% eigs$vectors)) #selittävät muuttujat, tällä kertaa muunnettu pääkomponenttien mukaan betamat < solve(t(x) %*% x) %*% t(x) %*% y #testataanpa jollakin yksittäisellä havainnolla as.matrix(cbind(1, as.matrix(lehma[1444, 6]) %*% eigs$vectors)) %*% betamat # edelleen ~1.086 lehma[1444,6] # = 1 #testataanpa koko loppudatalla arvatut < as.matrix(cbind(1, as.matrix(lehma[ koulutus, 6]) %*% eigs$vectors)) %*% betamat oikein < sum((round(arvatut) c(lehma[ koulutus,6])) == 0) testilehmia < length(lehma[ koulutus,1]) #arvausprosentti: oikein / testilehmia #edelleen 82,26 % #################### PCA (muuttujia karsittu) ###################### #huom! eigs laskettu jo edellä y < as.matrix(c(lehma[koulutus,6])) #selitettävä(t) muuttuja(t) x < as.matrix(cbind((rep(1, length(lehma[koulutus,6]))), as.matrix(lehma[koulutus, 6]) %*% eigs$vectors[,1:2])) #selittävät muuttujat, tällä kertaa muunnettu pääkomponenttien mukaan betamat < solve(t(x) %*% x) %*% t(x) %*% y #testataanpa jollakin yksittäisellä havainnolla as.matrix(cbind(1, as.matrix(lehma[1444, 6]) %*% eigs$vectors[,1:2])) %*% betamat # nyt ~1.1342 lehma[1444,6] # = 1 #testataanpa koko loppudatalla arvatut < as.matrix(cbind(1, as.matrix(lehma[ koulutus, 6]) %*% eigs$vectors[,1:2])) %*% betamat oikein < sum((round(arvatut) c(lehma[ koulutus,6])) == 0) testilehmia < length(lehma[ koulutus,1])
#arvausprosentti: oikein / testilehmia #nyt 79,44 % (ennen 82,26 %) #siis typistämällä tarkasteltavia muuttujia sopivalla muunnoksella (PCA) viidestä kahteen kadotetaan tässä tapauksessa verrattain vähän luokittelutarkkuuden suhteen (alle 3 %:n ero) #parempia luokittelutuloksia ei luonnollisesti saada, mutta "luokittelutarkkuus / muuttujien lkm" lukuarvon kasvu on ainakin vaikuttava #pari esimerkkiplottausta (1 4, 5 2) muuttujapareista #PCA ja virheellisesti luokitellut havainnot