Intro

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)

Riduzione della DTM

#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

Modelli di previsione

Task 1

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

Creazione previsioni dataset Test

yhat=predict(modlm,newdata = Xtest[,])>thr
write.table(file='previsioni/predicted_task1_lm.txt',yhat,row.names = FALSE,col.names = FALSE)

Task2: polarity classification

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

Creazione previsioni dataset Test

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)

Task 3

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

Creazione previsioni dataset Test

yhat=predict(modlm,newdata = Xtest[,])>thr
write.table(file='previsioni/predicted_task3_lm.txt', yhat,row.names = FALSE,col.names = FALSE)

Come scegliere tra diversi modelli?

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?

EXTRA

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")