Large Language Modelle lokal mit R nutzen

Wenn es um Large Language Models (LLMs) geht, gibt es Momente, in denen ich mich frage: Muss ich meine Daten wirklich einmal um den halben Globus zu OpenAI schicken, nur um eine Zusammenfassung zu bekommen? Mit Ollama gibt es mittlerweile einen Standard, um Modelle wie Llama 3 oder Mistral lokal laufen zu lassen. Diese Modelle können direkt aus R gesteuert werden. Das spart nicht nur Geld, sondern löst auch das Datenschutz-Problem ziemlich elegant. In diesem Artikel geht es darum, wie man das in R am besten umsetzt. Spoiler: Es gibt nicht den einen Weg, sondern (mindestens) zwei sehr gute Pakete mit völlig unterschiedlichen Philosophien.

Weiterlesen

Wie man aus Webanalysedaten automatisch Aktionen generiert

Dieser Talk ist schon ein paar Monate alt, aber ich hatte vergessen, ihn hier zu veröffentlichen. Er behandelt mein Peer-reviewtes akzeptiertes Paper „Bridging the Analytics Gap: Optimizing Content Performance using Actionable Knowledge Discovery“ für die HT ’24. Das Paper kann unter Proceedings of the 35th ACM Conference on Hypertext and Social Media eingesehen werden.

Reihennamen in R

Manche Datensätze nutzen Reihennamen, zum Beispiel der in R enthaltene Datensatz mtcars:

Das ist zwar praktisch, aber suboptimal, wenn man zum Beispiel Autos nach Marken sortieren will. Wie kann man Reihennamen in eine Spalte konvertieren, zum Beispiel mit dem Tidyverse? Ganz einfach:

library(tidyverse)

# mtcars laden und die Reihenamen in eine Spalte verschieben
mtcars_tidy <- mtcars %>%
  rownames_to_column(var = "car_name")

Das Ergebnis sieht dann so aus:

Überschneidungen von ETFs in einem UpSet-Diagramm visualisieren

Heute kommen mal zwei für mich spannende Themen zusammen, nämlich Datenanalyse- und visualisierung sowie Finanzen. Die Wahl der richtigen ETFs füllt unzählige Internetseiten und Finanzmagazin-Artikel, spannend ist hierbei aber auch, welche Überschneidungen ETFs haben. Verglichen hatte ich schon mal den Vanguard FTSE All-World High Dividend Yield UCITS ETF USD Distributing (ISIN: IE00B8GKDB10) und den iShares STOXX Global Select Dividend 100 UCITS (ISIN: DE000A0F5UH1). Ich hatte auch schon die Performance verglichen von diesen beiden und dem VanEck Morningstar Developed Markets Dividend Leaders ETF (NL0011683594) und einem MSCI World ETF (IE00B4L5Y983).

Weiterlesen

ggplot2 und die neue Pipe

Warum funktioniert dieser Code nicht?

mtcars |> ggplot(., aes(x = mpg, y = hp)) + geom_point()

Das Problem mit dem oben genannten Code liegt in der Verwendung des Pipe-Operators (|>), direkt vor ggplot. ggplot2 wird nicht nativ mit der R-spezifischen Pipe (|>) unterstützt, wie hier verwendet. Allerdings funktioniert ggplot2 nahtlos mit dem Magrittr-Pipe (%>%) aus dem dplyr-Paket. Hier ist die korrekte Verwendung:

library(ggplot2)
library(dplyr)

mtcars %>% 
  ggplot(aes(x = mpg, y = hp)) + 
  geom_point()

Alternativ müssen die Daten explizit in ggplot übergeben werden, wie hier:

library(ggplot2)

mtcars |> 
  ggplot(data = ., aes(x = mpg, y = hp)) + 
  geom_point()

Hier stellt der Punkt (.) die Daten dar, die von mtcars in ggplot gepiped werden, und Sie müssen ihn als data-Argument in der ggplot-Funktion spezifizieren.

Von WordPress zu Hugo und wieder zurück

Vor 3 Jahren, zum 15. Geburtstag dieses Blogs, war ich umgezogen von WordPress zu Hugo. Superschnelle Seiten, alles in R, eigentlich eine coole Sache. Aber in der Realität war es nicht so cool. Ich brauchte immer eine R-Umgebung, die ich nicht immer hatte. Git machte mich manchmal wahnsinnig. Und manche Probleme waren einfach nicht nachzuvollziehen. Und so bin ich jetzt wieder umgezogen. Vielleicht kommen nun auch die Rankings wieder zurück, die ich auch verloren hatte nach dem Umzug.

Apple MacBook Pro M1 Max – Lohnt es sich für Machine Learning?

Schon wieder ein neues MacBook? War das Air nicht gerade erst neu gekauft? Ja, es hat sogar noch Garantie, und dann lohnt es sich umso mehr, das Ding zu verkaufen. Ich bin ein großer Fan des Air-Formfaktors, und mit den Pro-Modellen habe ich mich nie anfreunden können. Aber die Limitierung auf 16GB Arbeitsspeicher des MacBook Air war damals schon schwer zu akzeptieren, nur Alternativen gab es nicht. Und so habe ich an dem Abend, an dem die neuen MacBook Pros mit M1 Pro und M1 Max vorgestellt wurden, auch gleich ein Gerät bestellt, ein MacBook Pro 14“ M1 Max mit 10 Kernen, 24 GPU-Kernen, 16-Kern Neutral Engine, 64 GB Arbeitsspeicher (!!!) und einer 2 TB Platte. Mein MacBook Air hat 16 GB RAM und halt den ersten M1-Prozessor mit 8 Kernen.

Weiterlesen

Material zum Web Analytics Wednesday 8. April 2020


Schön, dass Du beim ersten virtuellen Web Analytics Wednesday dabei warst. Hier sind die versprochenen Links:

Alle mit + markierten Link sind Affiliate-Links

Von WordPress zu Hugo: 15 Jahre Blogging


Zum 15. Geburtstag dieses Blogs gibt es nicht nur ein Redesign, sondern auch neue Technik unter der Motorhaube:

  • Blogdown ermöglicht es, mit R eine Website auf Basis von Hugo zu erstellen. So kann ich mit meiner Lieblingssprache mein Blog gestalten und muss nicht jedes Mal überlegen, wie ich meinen R-Code oder die Grafiken in WordPress kriege.
  • Der Output ist pures HTML, was die Abhängigkeit von Datenbanken, WordPress-Plugins etc zum einen abschafft und zum andern, und das ist für mich extrem wichtig, eine superschnelle Auslieferung von Inhalten ermöglicht (siehe Screenshot von den Google PageSpeed Insights unten bei den Tests mit meinem Preview-Server). Ich bekomme nun auch keine Mails mehr, weil irgendjemand versucht hat, in meinen Server einzudringen, oder weil der Datenbankserver zu viel Arbeitsspeicher benötigt.
  • Der Workflow ist fast vollautomatisch: Ich schreibe meine Texte in RStudio, committe einen Stand auf GitHub, und von da aus wird automatisch auf meinen Webserver deployed. Wenn mir was misslingt, gehe ich halt auf einen früheren Commit zurück. Continuous Deployment heißt das auf wohl auf Neudeutsch.

2005 hatte ich die erste Version des Blogs mit Movable Type realisiert. Damals wurden auch schon HTML-Seiten produziert, die dann nicht mehr in Echtzeit bei einem Seitenaufruf generiert werden mussten. Ich weiß nicht mehr, wann und warum ich auf WordPress wechselte. Vielleicht weil es dort mehr Erweiterungen gab. 10 Jahre war ich dann mindestens auf WordPress und mehr als einmal enorm genervt.

Der Wechsel auf Hugo lief nicht vollautomatisch. Der WordPress to Hugo Exporter war die einzige von den populären Optionen, die bei mir halbwegs funktioniert hat. Es ist notwendig, den Platz, den ein Blog heute auf der Disk und in der DB beansprucht, noch mal auf der Disk frei zu haben, denn alles wird darauf als Flatfiles repliziert. Die Fehlermeldungen, die das Skript ausspuckt, sind nicht hilfreich bei der Identifikation dieses zu erwartenden Fehlers. Gleichzeitig wurden nicht alle Seiten korrekt konvertiert, so dass ich fast alle Seiten noch mal anfassen musste.

Dabei ist mir zum einen aufgefallen, was sich alles seit 2005 geändert hat:

  • Menschen und Blogs, die ich vermisse, gefühlt gibt es kaum noch richtige Blogs,
  • Themen, die mich entweder heute noch interessieren oder bei denen ich mich frage, wie sie mich überhaupt interessieren konnten,
  • und jede Menge Links zu externen Seiten, die einfach tot sind, obwohl es die Seiten noch gibt.

Das Web ist genau so wenig statisch wie wir es sind, und die 15 Jahre sind für mich eine schöne Dokumentation meiner unterschiedlichen Etappen.