Erkennen von Instagram-Schleichwerbung mit Hilfe von R

Entscheidungsbäume, Random Forest, Support Vektor Maschinen, Neuronale Netze, ...

Moderator: consuli

consuli
Beiträge: 479
Registriert: Mo Okt 10, 2016 8:18 pm

Re: Erkennen von Instagram-Schleichwerbung mit Hilfe von R

Beitrag von consuli »

bnjmn_j hat geschrieben: Do Mai 31, 2018 3:47 pm

Code: Alles auswählen

Error in qr.default(X) : too large a matrix for LINPACK
Leider ist wohl der Datensatz zu groß? Habt ihr vielleicht einen Ratschlag wie man das lösen könnte?
biglm:bigglm() ?

Consuli
Irmgard.
Athomas
Beiträge: 768
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Erkennen von Instagram-Schleichwerbung mit Hilfe von R

Beitrag von Athomas »

Wenn man bereits ordentliche R-Vorkenntnisse und Basiswissen in Bezug auf Machine Learning hat, kann ich das Päckchen "h2o" (R Interface to H2O) empfehlen. (Auch) H2O arbeitet in-memory, sodass Du bei zu wenig RAM Probleme bekommen kannst. Aber im Gegensatz zu einigen R-Packages ist H2O von vornherein für fette Datensätze ausgelegt und entsprechend sparsam...

Für H2O existiert eine recht detaillierte Beschreibung: http://docs.h2o.ai/?_ga=2.3654448.14068 ... 1524227214

P.S.: Noch ein Hinweis zu Deinem konkreten Problem: wenn ich die Zeilen
$ caption : chr "throwback summer 08 #tb ...
und
demo_model <- multinom(output~caption+comments+likes, data=combinedData)
richtig interpretiere, ist "caption" die Bildbeschreibung des Users, eine Textvariable, die wahrscheinlich nur selten doppelt auftritt. Wenn Du die "roh" als Prognosevariable einsetzt - also mit ca. 100.000 Ausprägungen - sollte es nicht verwundern, dass die entstehenden Modellmatrizen groß werden :shock: !
bnjmn_j
Beiträge: 7
Registriert: Mi Mai 23, 2018 12:20 pm

Re: Erkennen von Instagram-Schleichwerbung mit Hilfe von R

Beitrag von bnjmn_j »

Hallo zusammen,

wollte euch ein kurzes Update geben.
Habe mittels dem Paket "RTextTools" recht gute Ergebnisse erzielt.
Das Paket bietet verschiedene Algorithmen zur Textklassifizierung und sogar Ensemble Learning. Man kann also mehrere Algorithmen im Model verwenden und dadurch die Treffergenauigkeit der Ergebnisse erhöhen. Ich habe anfangs nur mit einer Support Vector Machine gearbeitet und anschließend noch Maximum Entropy hinzugefügt.

Mit diesem Modell konnte ich ausschließlich anhand der Bildbeschreibung der jeweiligen Beiträge mehrere 100 Beiträge, die eindeutig der Kategorie Schleichwerbung zuzuordnen sind, aus meiner zufälligen Stichprobe (n=30.000) filtern.
Trainiert wurde das Modell mit der zuvor künstlich erstellten Schleichwerbung. Dazu habe ich die Beiträge die ich vorher anhand einiger Keywords (ad, sponsored, Werbung, etc.) gefiltert habe dupliziert und die Keywords aus der Bildbeschreibung gelöscht. Bin echt begeistert wie gut das funktioniert hat und dass es selbst für Anfänger wie mich relativ einfach umzusetzen war.

Falls jemand ähnliches probieren will, kann ich das Paket nur empfehlen!
consuli
Beiträge: 479
Registriert: Mo Okt 10, 2016 8:18 pm

Re: Erkennen von Instagram-Schleichwerbung mit Hilfe von R

Beitrag von consuli »

bnjmn_j hat geschrieben: Sa Jun 16, 2018 11:42 am wollte euch ein kurzes Update geben.
Habe mittels dem Paket "RTextTools" recht gute Ergebnisse erzielt.

Mit diesem Modell konnte ich ausschließlich anhand der Bildbeschreibung der jeweiligen Beiträge mehrere 100 Beiträge, die eindeutig der Kategorie Schleichwerbung zuzuordnen sind, aus meiner zufälligen Stichprobe (n=30.000) filtern.
Hallo bnjmin!

Mich würde interessieren, wie Du dieses Art "Schleichwerbung-Wörterbuch" mit Hilfe von RTextTools? erstellt hast.

Consuli
Irmgard.
bnjmn_j
Beiträge: 7
Registriert: Mi Mai 23, 2018 12:20 pm

Re: Erkennen von Instagram-Schleichwerbung mit Hilfe von R

Beitrag von bnjmn_j »

Hi Consuli,

tut mir Leid, hab vollkommen vergessen zu antworten.

Nachdem die Arbeit schon die längste Zeit benotet is sollte es kein Problem sein den Auszug aus dem Code hier zu veröffentlichen.
Das Schleichwerbung-Wörterbuch habe ich quasi mit Wörtern die häufig in Werbebeiträgen vorkommen und diese auch mehr oder weniger klar als Werbung ersichtlich machen erstellt - siehe wordList im Code. Könnte man vermutlich noch umfangreicher gestalten, für meine Zwecke hat es aber ausgereicht.

Hab nur mit SVM gearbeitet. Richtig interessant könnte es werden, wenn man das Klassifizierungsmodell weiter verbessert und mit noch mehr Daten trainiert. Beispielsweise mittels „Ensemble Learning“ weitere Algorithmen neben der SVM verwenden...

Code: Alles auswählen

#Liste mit Keywords zum filtern der Werbung
wordList = c('sponsored','advertisement','kooperation', 'werbung','\\bad\\b', 'advertising', 'commercial', 'anzeige', 'collaboration', 'collab', 'giveaway', 'gewinnspiel', 'verlosung', 'raffle')

# Hier werden mit Hilfe der erstellten wordList alle Beiträge die eines der 
# definierten Keywords enthalten als Werbung gekennzeichnet
dataset <- df %>% mutate(
  caption = tolower(caption),
  is_ad = ifelse(grepl(paste(c(wordList), collapse="|"), caption), 1, 0)
)

# hier sieht man das Verhältnis von Werbung zu keiner Werbung
summary(dataset$is_ad == 1)

# Ich füge "künstliche" Schleichwerbung hinzu indem ich die gekennzeichnete Werbung
# dupliziere und die Keywords der wordList aus den Beiträgen lösche

camouflagedAds = dataset %>%
  filter(is_ad == 1) %>%
  mutate(caption = gsub(paste(wordList, collapse="|"), "", tolower(caption))) %>%
  mutate(is_ad = 2)

# Zusammenführen der Daten

combinedData = dataset %>% rbind(camouflagedAds)

# Erstellen der neuen Datensätze für die 
# unterschiedlichen Kategorien:

ads = combinedData %>% filter(is_ad == 1) 
cmads = combinedData %>% filter(is_ad == 2)
nonAds = combinedData %>% filter(is_ad == 0)

adsCount = nrow(ads)
cmadsCount = nrow(cmads)
nonAdCount = nrow(nonAds)

# zufälligen Seed setzen damit man auf das selbe Ergebnis kommt
set.seed(1990)

# ziehen der zufälligen Stichprobe
# habe die Stichprobengröße 30.000 Beiträge gewählt, 
# da größere Stichproben zu Problemen geführt haben

inTrain = c(sample(1:cmadsCount, 1000),sample(cmadsCount+(1:nonAdCount),29000))

# Zusammenführen der Datensätze cmads + nonAds
# und umwandeln der Variable „is_ad“ in einen Faktor: 

alldata = rbind(cmads, nonAds) %>% mutate(is_ad = as.factor(is_ad))

# Trainingsdatensatz erstellen

trainData = alldata %>% slice(inTrain)

#Testdatensatz erstellen

testData = alldata %>% slice(-inTrain) %>% slice(1:30000)

#Document-Term Matrix für Training erstellen
dtMatrix = create_matrix(trainData$caption)

# Erstellen des Containers zum Trainieren der SVM
container = create_container(dtMatrix, trainData$is_ad, trainSize=1:nrow(trainData), virgin=FALSE)

# Trainieren des SVM Models
model = train_model(container, "SVM", kernel="linear", cost=1)


# Fehler im RTextTools Paket. Damit es funktioniert muss in Zeile 42
# das Wort "Acronym" durch "acronym" ersetzt werden. Ansonsten
# kommt eine Fehlermeldung.

trace("create_matrix", edit=T)

# Document-Term Matrix für Prognose erstellen
predMatrix = create_matrix(testData$caption, originalMatrix=dtMatrix)

# Den entsprechenden Container erstellen
predSize = length(testData$caption)
predictionContainer = create_container(predMatrix, labels=rep(0,predSize), testSize=1:predSize, virgin=FALSE)

# Prognose durchführen

results = classify_model(predictionContainer, model)
results

# Ergebnis der Prognose abrufen

table(results$SVM_LABEL)

# Confusion Matrix erstellen

Confusion_Matrix = confusionMatrix(results$SVM_LABEL, testData$is_ad)
Confusion_Matrix
stargazer(Confusion_Matrix, type="html", out="Conf_mtrx.html")

# Datensatz für weitere Analyse erstellen 
# künstliche Schleichwerbung wird wieder Werbung, durch SVM erkannte Schleichwerbung bleibt 

output = testData %>% 
  cbind(results) %>% 
  mutate(SVM_Klassifizierung = ifelse(is_ad =="2", "Werbung", ifelse(SVM_LABEL == "2","Schleichwerbung", "Keine Werbung")),
         labels = as.factor(ifelse(SVM_Klassifizierung == "Werbung", 1, ifelse(SVM_Klassifizierung == "Keine Werbung",0,2))))

head(output)
str(output)

# eigene Datensätze für die jeweiligen Kategorien erstellen

SVM_ads = output %>% filter(SVM_Klassifizierung == "Werbung") 
SVM_cmads = output %>% filter(SVM_Klassifizierung == "Schleichwerbung")
SVM_nonAds = output %>% filter(SVM_Klassifizierung == "Keine Werbung")

# Crossfold Validation SVM mit RTextTools

SVM_cv = cross_validate(container,4,"SVM")
SVM_cv
LG,
bnjmn_j
consuli
Beiträge: 479
Registriert: Mo Okt 10, 2016 8:18 pm

Re: Erkennen von Instagram-Schleichwerbung mit Hilfe von R

Beitrag von consuli »

Schöner Beispielcode fürs Forum. Vielen Dank.
Irmgard.
Antworten