Leggo i dati preprocessati e le funzioni per calcolare l’errore:
rm(list=ls())
load("dati_FunScore.Rdata")
#sostituisco
# [1] "Conteggi.\\?" "Conteggi.\\!"
# [3] "Conteggi.@" "Conteggi.#"
# [5] "Conteggi.(€|euro)" "Conteggi.(\\$|dollar)"]
# con un nome senza caratteri speciali
contgg=grep("Conteggi\\.",names(X))
names(X)[contgg]=paste("simbolo",sep="",1:length(contgg))
#per avere una risposta numerica 0-1:
tweets$soggettivo=tweets$soggettivo*1
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
#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 20 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)>=20]
X=cbind(X[,1:3],dtm)
rm(dtm)
dim(X)
## [1] 4513 246
library(rpart)
modrp=rpart(tweets$soggettivo~.,data=X,method = "class")
printcp(modrp)
##
## Classification tree:
## rpart(formula = tweets$soggettivo ~ ., data = X, method = "class")
##
## Variables actually used in tree construction:
## [1] persia sentNEG simbolo2 simbolo4 wwwurlwww
##
## Root node error: 1276/4513 = 0.28274
##
## n= 4513
##
## CP nsplit rel error xerror xstd
## 1 0.043103 0 1.00000 1.00000 0.023709
## 2 0.036834 2 0.91379 0.96082 0.023419
## 3 0.019592 3 0.87696 0.87696 0.022735
## 4 0.018809 4 0.85737 0.86991 0.022673
## 5 0.010000 5 0.83856 0.83856 0.022391
Tabella di confusione
table(tweets$soggettivo,predict(modrp,type = "class"))
##
## 0 1
## 0 592 684
## 1 386 2851
Threshold:
thr=quantile(predict(modrp)[,2],1-mean(tweets$soggettivo))
thr
## 28.27388%
## 0.6028571
predetti=predict(modrp)[,2]>thr
Tabella di confusione con threshold
table(tweets$soggettivo,predict(modrp,type = "class"))
##
## 0 1
## 0 592 684
## 1 386 2851
Scelgo una soglia, non lascio decidere a rpart
F_soggettivo=F_class(true = tweets$soggettivo ,
predetti)
## recall precision F
## 0.8155700 0.8288854 0.8221738
F_obj=F_class(true = tweets$soggettivo==0,predetti==0)
## recall precision F
## 0.5728840 0.5504518 0.5614439
(F_obj+F_soggettivo)/2
## [1] 0.6918089
yhat=predict(modrp,newdata = Xtest)[,2]>thr
write.table(file='previsioni/predicted_task1_tree.txt',yhat,row.names = FALSE,col.names = FALSE)
modrp.ext <- rpart(tweets$soggettivo~.,data=X,method = "class",xval=10,cp=0)
printcp(modrp.ext)
##
## Classification tree:
## rpart(formula = tweets$soggettivo ~ ., data = X, method = "class",
## xval = 10, cp = 0)
##
## Variables actually used in tree construction:
## [1] @addthis buon ciao crisi dopo
## [6] governo governo_monti grillo italia lega
## [11] manovra mario_monti ministri nchars non
## [16] oggi persia piazzapulita più politica
## [21] premier roma senato sentNEG sentPOS
## [26] simbolo1 simbolo2 simbolo3 simbolo4 stampa
## [31] vita voti wwwurlwww @youtube
##
## Root node error: 1276/4513 = 0.28274
##
## n= 4513
##
## CP nsplit rel error xerror xstd
## 1 0.04310345 0 1.00000 1.00000 0.023709
## 2 0.03683386 2 0.91379 0.99451 0.023669
## 3 0.01959248 3 0.87696 0.88558 0.022809
## 4 0.01880878 4 0.85737 0.87461 0.022714
## 5 0.00822884 5 0.83856 0.84013 0.022406
## 6 0.00626959 7 0.82210 0.84404 0.022441
## 7 0.00548589 8 0.81583 0.83386 0.022348
## 8 0.00313480 9 0.81034 0.82837 0.022297
## 9 0.00293887 11 0.80408 0.83934 0.022398
## 10 0.00235110 17 0.78448 0.83621 0.022370
## 11 0.00195925 22 0.77194 0.83699 0.022377
## 12 0.00182863 24 0.76803 0.84326 0.022434
## 13 0.00156740 28 0.75940 0.84326 0.022434
## 14 0.00125392 42 0.73197 0.84639 0.022463
## 15 0.00117555 53 0.71317 0.85502 0.022541
## 16 0.00104493 58 0.70690 0.85345 0.022527
## 17 0.00097962 63 0.70141 0.85815 0.022569
## 18 0.00078370 71 0.69357 0.85893 0.022576
## 19 0.00058777 88 0.67947 0.87147 0.022687
## 20 0.00052247 97 0.67398 0.87461 0.022714
## 21 0.00044783 103 0.67085 0.88088 0.022769
## 22 0.00039185 129 0.65909 0.88401 0.022796
## 23 0.00031348 131 0.65831 0.88480 0.022802
## 24 0.00026123 136 0.65674 0.88323 0.022789
## 25 0.00019592 139 0.65596 0.88323 0.022789
## 26 0.00000000 143 0.65517 0.90047 0.022935
plot(modrp.ext)
plotcp(modrp.ext)
Tabella di confusione
table(tweets$soggettivo,predict(modrp.ext,type = "class"))
##
## 0 1
## 0 705 571
## 1 265 2972
thr=quantile(predict(modrp.ext)[,2],1-mean(tweets$soggettivo))
thr
## 28.27388%
## 0.6666667
predetti=predict(modrp.ext)[,2]>thr
F_soggettivo=F_class(true = tweets$soggettivo ,
predetti)
## recall precision F
## 0.8541860 0.8640625 0.8590959
F_obj=F_class(true = tweets$soggettivo==0,predetti==0)
## recall precision F
## 0.6590909 0.6405179 0.6496717
(F_obj+F_soggettivo)/2
## [1] 0.7543838
yhat=predict(modrp.ext,newdata = Xtest)[,2]>thr
write.table(file='previsioni/predicted_task1_tree_max.txt',yhat,row.names = FALSE,col.names = FALSE)
modrp.prune= prune(modrp.ext,cp = .005)
printcp(modrp.prune)
##
## Classification tree:
## rpart(formula = tweets$soggettivo ~ ., data = X, method = "class",
## xval = 10, cp = 0)
##
## Variables actually used in tree construction:
## [1] buon non oggi persia sentNEG sentPOS simbolo2
## [8] simbolo4 wwwurlwww
##
## Root node error: 1276/4513 = 0.28274
##
## n= 4513
##
## CP nsplit rel error xerror xstd
## 1 0.0431034 0 1.00000 1.00000 0.023709
## 2 0.0368339 2 0.91379 0.99451 0.023669
## 3 0.0195925 3 0.87696 0.88558 0.022809
## 4 0.0188088 4 0.85737 0.87461 0.022714
## 5 0.0082288 5 0.83856 0.84013 0.022406
## 6 0.0062696 7 0.82210 0.84404 0.022441
## 7 0.0054859 8 0.81583 0.83386 0.022348
## 8 0.0050000 9 0.81034 0.82837 0.022297
plot(modrp.prune)
plotcp(modrp.prune)
thr=quantile(predict(modrp.prune)[,2],1-mean(tweets$soggettivo))
thr
## 28.27388%
## 0.744186
predetti=predict(modrp.prune)[,2]>thr
F_soggettivo=F_class(true = tweets$soggettivo ,
predetti)
## recall precision F
## 0.8183503 0.8291080 0.8236940
F_obj=F_class(true = tweets$soggettivo==0,predetti==0)
## recall precision F
## 0.5721003 0.5538695 0.5628373
(F_obj+F_soggettivo)/2
## [1] 0.6932657
yhat=predict(modrp.prune,newdata = Xtest)[,2]>thr
write.table(file='previsioni/predicted_task1_tree_prune.txt',yhat,row.names = FALSE,col.names = FALSE)