Leggo i dati preprocessati e le funzioni per calcolare l’errore:
rm(list=ls())
load("dati_FunScore.Rdata")
creo il dataset di test per usarlo in seguito e riduco tweets
al solo training set:
set.seed(1)
test=tweets[is.na(tweets$soggettivo),]
dim(test)
## [1] 1935 8
Xtest=X[is.na(tweets$soggettivo),]
dim(Xtest)
## [1] 1935 15286
X=X[!is.na(tweets$soggettivo),]
dim(X)
## [1] 4513 15286
tweets=tweets[!is.na(tweets$soggettivo),]
dim(tweets)
## [1] 4513 8
Mi creo un test set per uso interno estraendolo dal training set:
set.seed(1)
id_test=sample(nrow(tweets),700)
#le prime tre colonne sono sentiment e ncaratteri:
names(X[,1:8])
## [1] "sentPOS" "sentNEG"
## [3] "nchars" "♩♪♬"
## [5] "\U0001f60d\U0001f618✌" "\u270b\U0001f60f\U0001f612"
## [7] "\U0001f60d\U0001f60d\U0001f60d" "\U0001f602\U0001f602\U0001f602"
dim(X)
## [1] 4513 15286
Molte parole sono presenti pochissime volte, ad esempio tengo solo quelle che sono presenti almeno 50 volte
table(colSums(X[,-(1:3)]))
##
## 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
## 3316 7976 1572 701 405 281 167 133 91 77 58 52 44 39 35
## 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
## 27 19 21 10 16 11 10 14 16 13 10 16 6 7 12
## 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
## 1 2 5 5 8 8 7 1 4 2 2 2 4 1 1
## 45 46 48 49 50 51 52 54 55 57 58 59 60 61 62
## 2 4 1 2 2 1 1 2 2 2 1 1 1 2 1
## 63 64 66 67 68 69 72 73 77 78 79 80 87 90 91
## 1 1 2 2 2 1 2 2 1 2 1 1 1 1 1
## 94 98 100 101 109 115 117 121 123 127 130 145 150 156 172
## 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## 174 175 179 258 286 764 793 970 972 1070 1476 1492 1825 3823
## 1 1 1 1 1 1 1 1 1 1 1 1 1 1
dtm=X[,-(1:3)]
dtm=dtm[,colSums(dtm)>=50]
X=cbind(X[,1:3],dtm)
dim(X)
## [1] 4513 69
modlm=lm(tweets$soggettivo[-id_test]~.,data=X[-id_test,])
summary(modlm)
##
## Call:
## lm(formula = tweets$soggettivo[-id_test] ~ ., data = X[-id_test,
## ])
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.0773 -0.3475 0.1209 0.2723 1.0636
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.6298549 0.0241119 26.122 < 2e-16 ***
## sentPOSTRUE 0.0723130 0.0168012 4.304 1.72e-05 ***
## sentNEGTRUE 0.1225006 0.0168365 7.276 4.17e-13 ***
## nchars 0.0008382 0.0002357 3.556 0.000382 ***
## ancora -0.0292939 0.0415985 -0.704 0.481349
## anni 0.1222365 0.0563194 2.170 0.030038 *
## bello 0.1489307 0.0535769 2.780 0.005467 **
## bene 0.0719762 0.0366259 1.965 0.049468 *
## berlusconi -0.0143540 0.0402611 -0.357 0.721469
## cosa 0.0039441 0.0395517 0.100 0.920573
## crisi -0.0340371 0.0463007 -0.735 0.462305
## dice 0.1437253 0.0558530 2.573 0.010112 *
## dire 0.0821537 0.0619390 1.326 0.184800
## dopo -0.1028164 0.0409446 -2.511 0.012077 *
## ecco -0.0759624 0.0601652 -1.263 0.206825
## emoteahah 0.1282738 0.0470616 2.726 0.006447 **
## emotegood 0.1141680 0.0321368 3.553 0.000386 ***
## emotelove 0.0669526 0.0305715 2.190 0.028583 *
## essere 0.0201801 0.0524570 0.385 0.700483
## fare 0.0048443 0.0342932 0.141 0.887672
## fatto -0.0634086 0.0350903 -1.807 0.070841 .
## fiducia -0.0978457 0.0527157 -1.856 0.063518 .
## gente 0.0389985 0.0537177 0.726 0.467891
## governo 0.0085070 0.0361009 0.236 0.813722
## governo_monti 0.1115236 0.0185097 6.025 1.85e-09 ***
## grande 0.0816795 0.0578361 1.412 0.157957
## grazie 0.1096536 0.0411746 2.663 0.007775 **
## grillo 0.0085611 0.0224499 0.381 0.702973
## italia -0.0564340 0.0272921 -2.068 0.038730 *
## italiani 0.0410902 0.0535638 0.767 0.443055
## lavoro -0.0090591 0.0544440 -0.166 0.867857
## lega -0.0746722 0.0453790 -1.646 0.099946 .
## mai 0.0743092 0.0597130 1.244 0.213416
## male 0.0902139 0.0513961 1.755 0.079295 .
## manovra -0.1072444 0.0364166 -2.945 0.003250 **
## mario_monti 0.1138978 0.0211916 5.375 8.14e-08 ***
## ministri -0.0700901 0.0564041 -1.243 0.214077
## monti 0.0248346 0.0455640 0.545 0.585753
## napolitano 0.0306424 0.0588347 0.521 0.602521
## non 0.0505892 0.0146894 3.444 0.000580 ***
## nuovo 0.0350389 0.0509805 0.687 0.491936
## oggi -0.1354533 0.0456084 -2.970 0.002998 **
## ora -0.0212444 0.0436636 -0.487 0.626607
## paese 0.0764770 0.0515918 1.482 0.138332
## partiti -0.0279192 0.0575971 -0.485 0.627894
## pdl 0.0316389 0.0538715 0.587 0.557036
## piace 0.1276054 0.0561713 2.272 0.023160 *
## piazzapulita -0.0632723 0.0545706 -1.159 0.246343
## più 0.0402655 0.0282978 1.423 0.154844
## politica 0.0435418 0.0348647 1.249 0.211787
## politici 0.0438048 0.0585082 0.749 0.454088
## premier -0.2747705 0.0613715 -4.477 7.79e-06 ***
## presidente -0.0382988 0.0582028 -0.658 0.510564
## prima -0.0267098 0.0501032 -0.533 0.593999
## roma -0.0224275 0.0476470 -0.471 0.637882
## sempre 0.0525554 0.0476576 1.103 0.270198
## senza 0.0544466 0.0482735 1.128 0.259444
## serviziopubblico -0.1748989 0.0469873 -3.722 0.000200 ***
## solo 0.0611584 0.0411821 1.485 0.137608
## stato -0.0135970 0.0541061 -0.251 0.801594
## twitter -0.1326370 0.0621141 -2.135 0.032795 *
## video -0.0706456 0.0611622 -1.155 0.248143
## vita -0.0461096 0.0436383 -1.057 0.290749
## vuole 0.0234066 0.0611201 0.383 0.701771
## wwwurlwww -0.3283594 0.0150521 -21.815 < 2e-16 ***
## `Conteggi.\\\\?` -0.0520262 0.0132245 -3.934 8.50e-05 ***
## `Conteggi.\\\\!` 0.0607215 0.0087655 6.927 5.03e-12 ***
## `Conteggi.@` -0.0194494 0.0101460 -1.917 0.055321 .
## `Conteggi.#` -0.0275745 0.0060375 -4.567 5.10e-06 ***
## `Conteggi.(€|euro)` 0.0468947 0.0559391 0.838 0.401906
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.4032 on 3743 degrees of freedom
## Multiple R-squared: 0.2201, Adjusted R-squared: 0.2057
## F-statistic: 15.31 on 69 and 3743 DF, p-value: < 2.2e-16
Come scelgo la soglia (il threshold) per la classificazione?
Una proposta tra tante: Quantile della proporzione di zeri (sul training set stimo la stessa proporzione di 1 osservati nel vettore tweets$obj
). non è detto che sia la scelta migliore (vedi anche dopo).
thr=quantile(predict(modlm),prop.table(table(tweets$soggettivo[-id_test]))[1])
thr
## 28.69132%
## 0.5866691
tab=table( tweets$soggettivo[id_test],predict(modlm,newdata = X[id_test,])>thr)
tab
##
## FALSE TRUE
## FALSE 98 84
## TRUE 86 432
F_soggettivo=F_class(true = tweets$soggettivo[id_test] ,(predict(modlm,newdata = X[id_test,])>thr)==1)
## recall precision F
## 0.8339768 0.8372093 0.8355899
F_obj=F_class(true = tweets$soggettivo[id_test]==0 ,(predict(modlm,newdata = X[id_test,])>thr)==0)
## recall precision F
## 0.5384615 0.5326087 0.5355191
(F_obj+F_soggettivo)/2
## [1] 0.6855545
yhat=predict(modlm,newdata = Xtest[,])>thr
write.table(file='previsioni/predicted_task1_lm.txt',yhat,row.names = FALSE,col.names = FALSE)
Modello per prevedere positivo
modlm_pos=lm(tweets$positivo[-id_test]~.,data=X[-id_test,])
summary(modlm_pos)
##
## Call:
## lm(formula = tweets$positivo[-id_test] ~ ., data = X[-id_test,
## ])
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.8776 -0.2697 -0.1396 0.3006 1.0435
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.2399954 0.0242584 9.893 < 2e-16 ***
## sentPOSTRUE 0.1735761 0.0169032 10.269 < 2e-16 ***
## sentNEGTRUE -0.0818738 0.0169387 -4.834 1.40e-06 ***
## nchars -0.0001597 0.0002372 -0.673 0.500710
## ancora -0.0254051 0.0418512 -0.607 0.543865
## anni 0.0014924 0.0566616 0.026 0.978988
## bello 0.1819104 0.0539024 3.375 0.000746 ***
## bene 0.1555856 0.0368484 4.222 2.48e-05 ***
## berlusconi -0.0126923 0.0405057 -0.313 0.754035
## cosa -0.0196737 0.0397919 -0.494 0.621043
## crisi 0.1274181 0.0465819 2.735 0.006261 **
## dice 0.0436902 0.0561923 0.778 0.436905
## dire 0.1367776 0.0623153 2.195 0.028230 *
## dopo -0.0049907 0.0411933 -0.121 0.903576
## ecco -0.1110587 0.0605307 -1.835 0.066622 .
## emoteahah 0.2749241 0.0473475 5.807 6.91e-09 ***
## emotegood 0.2067706 0.0323320 6.395 1.80e-10 ***
## emotelove 0.1258286 0.0307572 4.091 4.39e-05 ***
## essere 0.0816964 0.0527757 1.548 0.121709
## fare -0.0003363 0.0345015 -0.010 0.992224
## fatto 0.0544390 0.0353034 1.542 0.123150
## fiducia -0.0406133 0.0530359 -0.766 0.443861
## gente -0.1287077 0.0540441 -2.382 0.017290 *
## governo 0.0462881 0.0363202 1.274 0.202585
## governo_monti 0.0213395 0.0186221 1.146 0.251900
## grande 0.1035190 0.0581875 1.779 0.075311 .
## grazie 0.2706378 0.0414247 6.533 7.30e-11 ***
## grillo -0.0563106 0.0225863 -2.493 0.012705 *
## italia 0.0362312 0.0274579 1.320 0.187077
## italiani -0.0063006 0.0538892 -0.117 0.906932
## lavoro 0.0174816 0.0547747 0.319 0.749627
## lega -0.0194485 0.0456547 -0.426 0.670138
## mai -0.0169752 0.0600757 -0.283 0.777527
## male 0.0071103 0.0517083 0.138 0.890636
## manovra -0.1157355 0.0366379 -3.159 0.001596 **
## mario_monti 0.0093361 0.0213203 0.438 0.661487
## ministri 0.0550614 0.0567467 0.970 0.331959
## monti -0.0085399 0.0458408 -0.186 0.852224
## napolitano 0.0703244 0.0591921 1.188 0.234881
## non 0.0160774 0.0147786 1.088 0.276717
## nuovo 0.0958103 0.0512902 1.868 0.061840 .
## oggi -0.0139920 0.0458854 -0.305 0.760435
## ora 0.0551945 0.0439288 1.256 0.209031
## paese 0.0678740 0.0519052 1.308 0.191071
## partiti 0.0048441 0.0579470 0.084 0.933383
## pdl -0.0862157 0.0541988 -1.591 0.111754
## piace 0.1583990 0.0565125 2.803 0.005091 **
## piazzapulita 0.0282500 0.0549021 0.515 0.606896
## più 0.0474605 0.0284697 1.667 0.095588 .
## politica 0.0651993 0.0350765 1.859 0.063138 .
## politici 0.0199336 0.0588636 0.339 0.734900
## premier -0.0421223 0.0617444 -0.682 0.495151
## presidente 0.1365447 0.0585564 2.332 0.019761 *
## prima -0.0560870 0.0504076 -1.113 0.265922
## roma 0.0938215 0.0479365 1.957 0.050398 .
## sempre 0.0318299 0.0479471 0.664 0.506824
## senza 0.0927062 0.0485667 1.909 0.056359 .
## serviziopubblico -0.0132221 0.0472727 -0.280 0.779724
## solo -0.0811659 0.0414322 -1.959 0.050187 .
## stato 0.0503544 0.0544348 0.925 0.355005
## twitter -0.1011585 0.0624915 -1.619 0.105584
## video -0.0593108 0.0615338 -0.964 0.335171
## vita 0.0621036 0.0439034 1.415 0.157284
## vuole -0.1252577 0.0614914 -2.037 0.041721 *
## wwwurlwww -0.0814902 0.0151435 -5.381 7.85e-08 ***
## `Conteggi.\\\\?` -0.0927700 0.0133049 -6.973 3.66e-12 ***
## `Conteggi.\\\\!` 0.0712771 0.0088188 8.082 8.49e-16 ***
## `Conteggi.@` 0.0428411 0.0102077 4.197 2.77e-05 ***
## `Conteggi.#` -0.0075981 0.0060742 -1.251 0.211053
## `Conteggi.(€|euro)` -0.0362024 0.0562789 -0.643 0.520090
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.4056 on 3743 degrees of freedom
## Multiple R-squared: 0.2153, Adjusted R-squared: 0.2008
## F-statistic: 14.88 on 69 and 3743 DF, p-value: < 2.2e-16
# tab=table( tweets$positivo[id_test],predict(modlm_pos,newdata = X[id_test,])>.5)
thr_pos=quantile(predict(modlm_pos),prop.table(table(tweets$positivo[-id_test]))[1])
thr_pos
## 71.02019%
## 0.376487
tab=table( tweets$positivo[id_test],predict(modlm_pos,newdata = X[id_test,])>thr_pos)
tab
##
## FALSE TRUE
## FALSE 407 106
## TRUE 91 96
F_pos_1=F_class( tweets$positivo[id_test]==1,(predict(modlm_pos,newdata = X[id_test,])>thr)==1)
## recall precision F
## 0.2352941 0.6376812 0.3437500
F_pos_0=F_class( tweets$positivo[id_test]==0,(predict(modlm_pos,newdata = X[id_test,])>thr)==0)
## recall precision F
## 0.9512671 0.7733756 0.8531469
Modello per prevedere negativo
modlm_neg=lm(tweets$negativo[-id_test]~.,data=X[-id_test,])
summary(modlm_neg)
##
## Call:
## lm(formula = tweets$negativo[-id_test] ~ ., data = X[-id_test,
## ])
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.1934 -0.3529 -0.1295 0.4211 1.2023
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2.734e-01 2.678e-02 10.209 < 2e-16 ***
## sentPOSTRUE -8.906e-02 1.866e-02 -4.772 1.89e-06 ***
## sentNEGTRUE 1.931e-01 1.870e-02 10.328 < 2e-16 ***
## nchars 1.972e-03 2.618e-04 7.532 6.21e-14 ***
## ancora -2.194e-02 4.621e-02 -0.475 0.634912
## anni 1.854e-01 6.256e-02 2.964 0.003052 **
## bello 3.565e-02 5.951e-02 0.599 0.549170
## bene 1.666e-02 4.068e-02 0.409 0.682222
## berlusconi -4.369e-02 4.472e-02 -0.977 0.328631
## cosa -7.706e-03 4.393e-02 -0.175 0.860767
## crisi -8.162e-02 5.143e-02 -1.587 0.112587
## dice 1.926e-01 6.204e-02 3.104 0.001922 **
## dire 1.020e-01 6.880e-02 1.483 0.138273
## dopo -7.399e-02 4.548e-02 -1.627 0.103849
## ecco -3.676e-02 6.683e-02 -0.550 0.582353
## emoteahah -8.987e-02 5.227e-02 -1.719 0.085674 .
## emotegood -7.733e-02 3.570e-02 -2.166 0.030357 *
## emotelove -3.583e-02 3.396e-02 -1.055 0.291372
## essere -7.376e-02 5.827e-02 -1.266 0.205629
## fare -1.183e-02 3.809e-02 -0.310 0.756205
## fatto -5.624e-02 3.898e-02 -1.443 0.149156
## fiducia -4.407e-02 5.855e-02 -0.753 0.451765
## gente 3.582e-05 5.967e-02 0.001 0.999521
## governo 5.481e-02 4.010e-02 1.367 0.171764
## governo_monti 1.134e-01 2.056e-02 5.516 3.70e-08 ***
## grande 3.156e-02 6.424e-02 0.491 0.623221
## grazie -9.779e-02 4.574e-02 -2.138 0.032572 *
## grillo 9.407e-02 2.494e-02 3.772 0.000164 ***
## italia -4.168e-02 3.032e-02 -1.375 0.169224
## italiani 1.083e-01 5.950e-02 1.820 0.068781 .
## lavoro -2.340e-02 6.047e-02 -0.387 0.698812
## lega -3.880e-02 5.041e-02 -0.770 0.441463
## mai 9.370e-02 6.633e-02 1.413 0.157833
## male 5.254e-02 5.709e-02 0.920 0.357510
## manovra -2.586e-02 4.045e-02 -0.639 0.522602
## mario_monti 1.020e-01 2.354e-02 4.334 1.50e-05 ***
## ministri -7.518e-02 6.265e-02 -1.200 0.230235
## monti -4.341e-02 5.061e-02 -0.858 0.391148
## napolitano -2.586e-03 6.535e-02 -0.040 0.968437
## non 8.588e-02 1.632e-02 5.263 1.49e-07 ***
## nuovo -7.335e-02 5.663e-02 -1.295 0.195274
## oggi -9.198e-02 5.066e-02 -1.816 0.069505 .
## ora -4.400e-02 4.850e-02 -0.907 0.364356
## paese 8.799e-03 5.731e-02 0.154 0.877972
## partiti -1.270e-01 6.398e-02 -1.985 0.047200 *
## pdl 1.433e-01 5.984e-02 2.395 0.016681 *
## piace 1.537e-03 6.239e-02 0.025 0.980349
## piazzapulita -9.479e-02 6.062e-02 -1.564 0.117954
## più 2.724e-02 3.143e-02 0.867 0.386269
## politica -7.782e-04 3.873e-02 -0.020 0.983968
## politici 9.173e-02 6.499e-02 1.411 0.158194
## premier -2.236e-01 6.817e-02 -3.279 0.001049 **
## presidente -1.904e-01 6.465e-02 -2.945 0.003255 **
## prima -1.098e-02 5.565e-02 -0.197 0.843614
## roma -8.541e-02 5.292e-02 -1.614 0.106668
## sempre 9.276e-02 5.294e-02 1.752 0.079806 .
## senza 1.559e-02 5.362e-02 0.291 0.771248
## serviziopubblico -1.859e-01 5.219e-02 -3.562 0.000372 ***
## solo 1.499e-01 4.574e-02 3.277 0.001060 **
## stato -6.724e-02 6.010e-02 -1.119 0.263260
## twitter -1.371e-01 6.899e-02 -1.988 0.046903 *
## video -1.848e-02 6.794e-02 -0.272 0.785625
## vita -6.270e-02 4.847e-02 -1.293 0.195943
## vuole 3.940e-02 6.789e-02 0.580 0.561712
## wwwurlwww -2.388e-01 1.672e-02 -14.281 < 2e-16 ***
## `Conteggi.\\\\?` -1.383e-02 1.469e-02 -0.942 0.346424
## `Conteggi.\\\\!` 1.253e-02 9.736e-03 1.287 0.198091
## `Conteggi.@` -6.281e-02 1.127e-02 -5.573 2.68e-08 ***
## `Conteggi.#` -2.702e-02 6.706e-03 -4.029 5.71e-05 ***
## `Conteggi.(€|euro)` -3.408e-02 6.214e-02 -0.549 0.583372
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.4478 on 3743 degrees of freedom
## Multiple R-squared: 0.2008, Adjusted R-squared: 0.186
## F-statistic: 13.63 on 69 and 3743 DF, p-value: < 2.2e-16
# tab=table( tweets$negativo[id_test],predict(modlm_neg,newdata = X[id_test,])>.5)
thr_neg=quantile(predict(modlm_neg),prop.table(table(tweets$negativo[-id_test]))[1])
thr_neg
## 56.07133%
## 0.4622407
tab=table( tweets$negativo[id_test],predict(modlm_neg,newdata = X[id_test,])>thr_neg)
tab
##
## FALSE TRUE
## FALSE 250 124
## TRUE 116 210
F_neg_1=F_class( tweets$negativo[id_test]==1,(predict(modlm_neg,newdata = X[id_test,])>thr)==1)
## recall precision F
## 0.4018405 0.6931217 0.5087379
F_neg_0=F_class( tweets$negativo[id_test]==0,(predict(modlm_neg,newdata = X[id_test,])>thr)==0)
## recall precision F
## 0.8449198 0.6183953 0.7141243
Punteggio stimato sul test set:
((F_neg_0+F_neg_1)/2+(F_pos_0+F_pos_1)/2)/2
## [1] 0.6049398
yhat=cbind(predict(modlm_pos,newdata = Xtest)>thr_pos,
predict(modlm_neg,newdata = Xtest)>thr_neg)
str(yhat)
## logi [1:1935, 1:2] TRUE FALSE FALSE FALSE FALSE FALSE ...
## - attr(*, "dimnames")=List of 2
## ..$ : chr [1:1935] "4514" "4515" "4516" "4517" ...
## ..$ : NULL
write.table(file='previsioni/predicted_task2_lm.txt', yhat,row.names = FALSE,col.names = FALSE)
modlm=lm(tweets$iro[-id_test]~.,data=X[-id_test,])
summary(modlm)
##
## Call:
## lm(formula = tweets$iro[-id_test] ~ ., data = X[-id_test, ])
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.45010 -0.16312 -0.09214 -0.00378 1.09441
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.0886676 0.0188429 4.706 2.62e-06 ***
## sentPOSTRUE -0.0057102 0.0131297 -0.435 0.663656
## sentNEGTRUE 0.0023492 0.0131573 0.179 0.858304
## nchars 0.0007154 0.0001842 3.884 0.000105 ***
## ancora -0.0503908 0.0325082 -1.550 0.121203
## anni -0.0241102 0.0440122 -0.548 0.583858
## bello 0.0094012 0.0418690 0.225 0.822350
## bene -0.0689395 0.0286222 -2.409 0.016062 *
## berlusconi -0.0139541 0.0314630 -0.444 0.657423
## cosa -0.0264555 0.0309086 -0.856 0.392093
## crisi -0.0058110 0.0361828 -0.161 0.872417
## dice 0.1112841 0.0436477 2.550 0.010824 *
## dire 0.0593107 0.0484038 1.225 0.220527
## dopo 0.0287964 0.0319971 0.900 0.368196
## ecco 0.0252829 0.0470176 0.538 0.590793
## emoteahah 0.0817298 0.0367774 2.222 0.026324 *
## emotegood 0.0185120 0.0251141 0.737 0.461099
## emotelove -0.0166101 0.0238908 -0.695 0.486942
## essere -0.0629118 0.0409938 -1.535 0.124950
## fare -0.0089992 0.0267992 -0.336 0.737040
## fatto -0.0247464 0.0274222 -0.902 0.366890
## fiducia -0.0243686 0.0411960 -0.592 0.554201
## gente -0.0070980 0.0419790 -0.169 0.865740
## governo -0.0328609 0.0282119 -1.165 0.244179
## governo_monti 0.0887621 0.0144648 6.136 9.32e-10 ***
## grande -0.0602962 0.0451974 -1.334 0.182264
## grazie -0.0579396 0.0321769 -1.801 0.071837 .
## grillo -0.0364352 0.0175440 -2.077 0.037890 *
## italia -0.0547909 0.0213281 -2.569 0.010239 *
## italiani 0.0434901 0.0418587 1.039 0.298885
## lavoro -0.0240789 0.0425466 -0.566 0.571468
## lega -0.0379689 0.0354625 -1.071 0.284384
## mai 0.0264969 0.0466642 0.568 0.570191
## male 0.0432010 0.0401647 1.076 0.282178
## manovra -0.0654435 0.0284587 -2.300 0.021526 *
## mario_monti 0.1705331 0.0165607 10.297 < 2e-16 ***
## ministri 0.0066132 0.0440783 0.150 0.880746
## monti 0.0085175 0.0356071 0.239 0.810957
## napolitano -0.0601157 0.0459778 -1.307 0.191125
## non -0.0261003 0.0114794 -2.274 0.023042 *
## nuovo 0.0029913 0.0398400 0.075 0.940153
## oggi -0.0256115 0.0356418 -0.719 0.472444
## ora 0.0338545 0.0341220 0.992 0.321183
## paese -0.0710654 0.0403177 -1.763 0.078043 .
## partiti -0.0396928 0.0450106 -0.882 0.377912
## pdl 0.0504623 0.0420992 1.199 0.230739
## piace 0.1256165 0.0438964 2.862 0.004238 **
## piazzapulita -0.0504920 0.0426455 -1.184 0.236491
## più 0.0155385 0.0221140 0.703 0.482316
## politica -0.0794113 0.0272459 -2.915 0.003582 **
## politici 0.0662075 0.0457226 1.448 0.147694
## premier -0.1028954 0.0479603 -2.145 0.031983 *
## presidente -0.1242791 0.0454840 -2.732 0.006318 **
## prima -0.0379789 0.0391544 -0.970 0.332120
## roma -0.0488102 0.0372349 -1.311 0.189982
## sempre 0.0057755 0.0372432 0.155 0.876770
## senza -0.0630653 0.0377245 -1.672 0.094660 .
## serviziopubblico -0.0724055 0.0367194 -1.972 0.048699 *
## solo 0.0739730 0.0321827 2.299 0.021586 *
## stato 0.0037042 0.0422825 0.088 0.930195
## twitter -0.0032480 0.0485406 -0.067 0.946655
## video -0.0707529 0.0477967 -1.480 0.138881
## vita -0.0212918 0.0341022 -0.624 0.532434
## vuole -0.0483609 0.0477638 -1.013 0.311363
## wwwurlwww -0.1628698 0.0117628 -13.846 < 2e-16 ***
## `Conteggi.\\\\?` 0.0230279 0.0103346 2.228 0.025924 *
## `Conteggi.\\\\!` 0.0080553 0.0068500 1.176 0.239686
## `Conteggi.@` -0.0317905 0.0079289 -4.009 6.20e-05 ***
## `Conteggi.#` -0.0048099 0.0047181 -1.019 0.308057
## `Conteggi.(€|euro)` 0.0819679 0.0437149 1.875 0.060863 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.3151 on 3743 degrees of freedom
## Multiple R-squared: 0.1113, Adjusted R-squared: 0.09491
## F-statistic: 6.793 on 69 and 3743 DF, p-value: < 2.2e-16
thr=quantile(predict(modlm),prop.table(table(tweets$iro[-id_test]))[1])
thr
## 87.46394%
## 0.2602651
tab=table( tweets$iro[id_test],predict(modlm,newdata = X[id_test,])>thr)
tab
##
## FALSE TRUE
## FALSE 544 66
## TRUE 60 30
F_iro=F_class(true = tweets$iro[id_test]==1 ,(predict(modlm,newdata = X[id_test,])>thr)==1)
## recall precision F
## 0.3333333 0.3125000 0.3225806
F_noiro=F_class(true = tweets$iro[id_test]==0 ,(predict(modlm,newdata = X[id_test,])>thr)==0)
## recall precision F
## 0.8918033 0.9006623 0.8962109
(F_iro+F_noiro)/2
## [1] 0.6093958
yhat=predict(modlm,newdata = Xtest[,])>thr
write.table(file='previsioni/predicted_task3_lm.txt', yhat,row.names = FALSE,col.names = FALSE)
Come scegliere il miglior modello tra diversi possibili?
Sappiamo che onfrontare gli indici calcolati sugli stessi dati su cui abbiamo stimato i parametri del modello non è una buona idea…
Cosa proponete?
Posso provare a migliorare il risultato ottimizzando il threshold (Es Task 3):
ATTENZIONE su quale dataset ottimizzo il threshold??
# ne faccio una funzione
getScore <- function(thr){
F_iro=F_class(true = tweets$iro[-id_test] ,(predict(modlm)>thr)==1,verbatim=FALSE)
F_noiro=F_class(true = tweets$iro[-id_test]==0 ,(predict(modlm)>thr)==0,verbatim=FALSE)
(F_iro+F_noiro)/2
}
range(predict(modlm))
## [1] -0.5918353 0.5361353
#lo riduco un po':
limiti_valori_da_provare=range(predict(modlm))*.9
valori_da_provare=seq(limiti_valori_da_provare[1],limiti_valori_da_provare[2],length.out = 20)
scores=sapply(valori_da_provare,getScore)
results=cbind(thr=valori_da_provare,scoreTrain=scores)
results
## thr scoreTrain
## [1,] -0.532651752 0.1117217
## [2,] -0.479221565 0.1117217
## [3,] -0.425791378 0.1117217
## [4,] -0.372361192 0.1117217
## [5,] -0.318931005 0.1117217
## [6,] -0.265500818 0.1117217
## [7,] -0.212070632 0.1133478
## [8,] -0.158640445 0.1178788
## [9,] -0.105210258 0.1312805
## [10,] -0.051780071 0.1688751
## [11,] 0.001650115 0.2431069
## [12,] 0.055080302 0.3486290
## [13,] 0.108510489 0.4966426
## [14,] 0.161940675 0.5993335
## [15,] 0.215370862 0.6493345
## [16,] 0.268801049 0.6460787
## [17,] 0.322231235 0.5770578
## [18,] 0.375661422 0.5009859
## [19,] 0.429091609 0.4748487
## [20,] 0.482521795 0.4687170
plot(valori_da_provare,scores,type = "l",col=2)
max(scores,na.rm = TRUE)
## [1] 0.6493345
thr=valori_da_provare[which.max(scores)]
thr
## [1] 0.2153709
ora lo provo sul test set!
F_iro=F_class(true = tweets$iro[id_test]==1 ,(predict(modlm,newdata = X[id_test,])>thr)==1,verbatim=FALSE)
F_noiro=F_class(true = tweets$iro[id_test]==0 ,(predict(modlm,newdata = X[id_test,])>thr)==0,verbatim=FALSE)
(F_iro+F_noiro)/2
## [1] 0.5949499
A titolo di curiosità calcolo gli errori per i diversi treshold sul test set:
getScoreTest <- function(thr){
F_iro=F_class(true = tweets$iro[id_test]==1 ,(predict(modlm,newdata = X[id_test,])>thr)==1,verbatim=FALSE)
F_noiro=F_class(true = tweets$iro[id_test]==0 ,(predict(modlm,newdata = X[id_test,])>thr)==0,verbatim=FALSE)
(F_iro+F_noiro)/2
}
scoresTest=sapply(valori_da_provare,getScoreTest)
results=cbind(results, scoreTest=scoresTest)
results
## thr scoreTrain scoreTest
## [1,] -0.532651752 0.1117217 NaN
## [2,] -0.479221565 0.1117217 NaN
## [3,] -0.425791378 0.1117217 NaN
## [4,] -0.372361192 0.1117217 NaN
## [5,] -0.318931005 0.1117217 NaN
## [6,] -0.265500818 0.1117217 0.1157051
## [7,] -0.212070632 0.1133478 0.1227798
## [8,] -0.158640445 0.1178788 0.1297765
## [9,] -0.105210258 0.1312805 0.1384153
## [10,] -0.051780071 0.1688751 0.1799327
## [11,] 0.001650115 0.2431069 0.2456897
## [12,] 0.055080302 0.3486290 0.3403814
## [13,] 0.108510489 0.4966426 0.4778185
## [14,] 0.161940675 0.5993335 0.5953356
## [15,] 0.215370862 0.6493345 0.5949499
## [16,] 0.268801049 0.6460787 0.6102951
## [17,] 0.322231235 0.5770578 0.5431607
## [18,] 0.375661422 0.5009859 0.5251488
## [19,] 0.429091609 0.4748487 NaN
## [20,] 0.482521795 0.4687170 NaN
matplot(valori_da_provare,results[,-1],type = "l",col=2:3,lty=1,lwd=2,ylab="Scores")
legend("topleft",legend = colnames(results)[-1],lwd=2,lty=1,col=2:3,bty="n")