{"id":22132,"date":"2024-11-12T19:20:51","date_gmt":"2024-11-12T18:20:51","guid":{"rendered":"http:\/\/blog.wenzlaff.de\/?p=22132"},"modified":"2026-04-19T07:39:06","modified_gmt":"2026-04-19T05:39:06","slug":"der-brier-score-brier-wert-nicht-nur-fuer-prognostiker","status":"publish","type":"post","link":"http:\/\/blog.wenzlaff.de\/?p=22132","title":{"rendered":"Der Brier-Score (Brier-Wert) nicht nur f\u00fcr Prognostiker"},"content":{"rendered":"<p>Der <a href=\"https:\/\/en.wikipedia.org\/wiki\/Brier_score\" rel=\"noopener\" target=\"_blank\">Brier-Wert<\/a> ist ein effizientes und einfaches Ma\u00df zur Bewertung der Genauigkeit <a href=\"https:\/\/de.wikipedia.org\/wiki\/Probabilistische_Aussage\" rel=\"noopener\" target=\"_blank\">probabilistischer Vorhersagen<\/a>. Durch die Kombination aus einfacher Berechnung und aussagekr\u00e4ftiger Analyse ist er ein weit verbreitetes Werkzeug in der Statistik und im maschinellen Lernen. <\/p>\n<p>In der Praxis hilft er, die Qualit\u00e4t von Vorhersagen quantitativ zu bewerten und kann zur Verbesserung von Modellen und Algorithmen beitragen. Die Bezeichnung \u201eBrier-Wert\u201c stammt von dem amerikanischen Meteorologen Glenn W. Brier, der das Ma\u00df <a href=\"https:\/\/www.ametsoc.org\/index.cfm\/ams\/\" rel=\"noopener\" target=\"_blank\">(1950 &#8211; VERIFICATION OF FORECASTS EXPRESSED IN TERMS OF PROBABILITY)<\/a> entwickelte und damit die Grundlage legte.<\/p>\n<p>Der Brier-Wert wird h\u00e4ufig in Bereichen wie Meteorologie, Medizin, Finanzwesen, Wahlprognosen und maschinellem Lernen verwendet, um die Genauigkeit von Prognosen zu bewerten. Er ist besonders n\u00fctzlich bei bin\u00e4ren Klassifikationsproblemen, bei denen das Modell Wahrscheinlichkeiten f\u00fcr die Zugeh\u00f6rigkeit zu einer von zwei Klassen liefert (z. B. Regenwahrscheinlichkeit). <\/p>\n<p>Wir erstellen zur Verdeutlichung mal ein JSon Datei mit ein paar Daten von der Reserve Bank of Australia, die bei ihren monatlichen Sitzungen Zinss\u00e4tze beschlie\u00dft. Die <a href=\"https:\/\/cama.crawford.anu.edu.au\/rba-shadow-board\" rel=\"noopener\" target=\"_blank\">RBA<\/a> l\u00e4sst die Zinss\u00e4tze im Allgemeinen unver\u00e4ndert, erh\u00f6ht sie jedoch manchmal und senkt sie manchmal, je nach wirtschaftlicher Lage. Die Daten stammen aus diesem Artikel und wurden von mir in das JSon-Format \u00fcberf\u00fchrt. <!--more--><\/p>\n<p>Wir erstellen nun die <strong>input.json<\/strong> Datei mit diesem Inhalt.<\/p>\n<pre class=\"lang:default decode:true \" >{\r\n  \"comment\": \"Daten siehe https:\/\/timvangelder.com\/2015\/05\/18\/brier-score-composition-a-mini-tutorial\/\",\r\n  \"forecasts\": [0.71, 0.71, 0.7, 0.68, 0.64, 0.65, 0.67],\r\n  \"outcomes\":  [1, 1, 1, 0, 1, 1, 0]\r\n}<\/pre>\n<p>Nun brauchen wir noch ein Java-Programm das die Datei einliest und den Brier-Score berechnet:<\/p>\n<pre class=\"minimize:true lang:java decode:true \" >\r\n\r\npackage de.wenzlaff.mathe;\r\n\r\nimport java.io.IOException;\r\nimport java.nio.file.Files;\r\nimport java.nio.file.Paths;\r\n\r\nimport org.json.JSONArray;\r\nimport org.json.JSONObject;\r\n\r\n\/**\r\n * Der Brier-Wert ist ein Ma\u00df zur Bewertung von Prognosen und\r\n * Wahrscheinlichkeiten.\r\n * \r\n * Der Brier-Wert (englisch \"Brier Score\") ist eine wichtige Metrik zur\r\n * Bewertung der Genauigkeit von Wahrscheinlichkeitsprognosen, insbesondere im\r\n * Bereich maschinellen Lernens, der Statistik und bei Vorhersagemodellen. Der\r\n * Brier-Wert hilft dabei, die Genauigkeit einer Vorhersage zu quantifizieren,\r\n * indem er die Differenz zwischen vorhergesagten Wahrscheinlichkeiten und den\r\n * tats\u00e4chlich eingetretenen Ergebnissen misst. Dieser BrierScoreCalculator\r\n * liest eine JSon Datei in der Form:\r\n * \r\n * &lt;pre&gt;\r\n \r\n {\r\n  \"forecasts\": [0.8, 0.6, 0.2, 0.9, 0.1],\r\n  \"outcomes\":  [1, 1, 0, 1, 0]\r\n }\r\n * \r\n * &lt;\/pre&gt;\r\n * \r\n * ein und gibt das berechnete Ergebnis des Brier-Wert und die Inputwert in\r\n * einer Tabelle aus. z.B.\r\n * \r\n * &lt;pre&gt;\r\n\r\nIndex      Vorhersage      Ergebnis (1=eingetreten, 0=nicht eingetreten) \r\n-------------------------------------\r\n1          0,80            1         \r\n2          0,60            1         \r\n3          0,20            0         \r\n4          0,90            1         \r\n5          0,10            0         \r\n-------------------------------------\r\nBrier-Wert: 0,0520\r\n * \r\n * &lt;\/pre&gt;\r\n * &lt;p&gt;\r\n * Der Brier-Wert wird wie folgt berechnet:\r\n *\r\n * &lt;pre&gt;\r\n *     Brier-Wert = (1 \/ n) * \u03a3 (forecast\u1d62 - outcome\u1d62)\u00b2\r\n * &lt;\/pre&gt;\r\n *\r\n * wobei:\r\n * &lt;ul&gt;\r\n * &lt;li&gt;n = Anzahl der Vorhersagen&lt;\/li&gt;\r\n * &lt;li&gt;forecast\u1d62 = Wahrscheinlichkeitsvorhersage f\u00fcr das Ereignis i&lt;\/li&gt;\r\n * &lt;li&gt;outcome\u1d62 = tats\u00e4chliches Ergebnis des Ereignisses i (1 f\u00fcr eingetreten, 0\r\n * f\u00fcr nicht eingetreten)&lt;\/li&gt;\r\n * &lt;\/ul&gt;\r\n * \r\n * @author Thomas Wenzlaff\r\n *\/\r\npublic class BrierScoreCalculator {\r\n\r\n\tpublic static void main(String[] args) {\r\n\r\n\t\t\/\/ \u00dcberpr\u00fcfen, ob der Dateipfad als Argument \u00fcbergeben wurde\r\n\t\tif (args.length != 1) {\r\n\t\t\tSystem.out.println(\"Bitte geben Sie den Pfad zur JSON-Datei als Argument an.\");\r\n\t\t\tSystem.out.println(\"Beispiel: java BrierScoreCalculator input.json\");\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t\/\/ Dateipfad zur JSON-Datei\r\n\t\tString jsonFilePath = args[0];\r\n\r\n\t\ttry {\r\n\t\t\t\/\/ JSON-Datei laden und als String einlesen\r\n\t\t\tString content = new String(Files.readAllBytes(Paths.get(jsonFilePath)));\r\n\r\n\t\t\t\/\/ JSON-Objekt erstellen und Arrays extrahieren\r\n\t\t\tJSONObject jsonObject = new JSONObject(content);\r\n\t\t\tJSONArray forecastsArray = jsonObject.getJSONArray(\"forecasts\");\r\n\t\t\tJSONArray outcomesArray = jsonObject.getJSONArray(\"outcomes\");\r\n\r\n\t\t\tdouble[] forecasts = new double[forecastsArray.length()];\/\/ Vorhergesagte Wahrscheinlichkeiten\r\n\t\t\tint[] outcomes = new int[outcomesArray.length()]; \/\/ Tats\u00e4chliche Ergebnisse\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\/\/ (1 = Ereignis eingetreten, 0 = Ereignis nicht eingetreten\r\n\t\t\tfor (int i = 0; i &lt; forecastsArray.length(); i++) {\r\n\t\t\t\tforecasts[i] = forecastsArray.getDouble(i);\r\n\t\t\t\toutcomes[i] = outcomesArray.getInt(i);\r\n\t\t\t}\r\n\r\n\t\t\tdouble brierScore = berechneBrierScore(forecasts, outcomes);\r\n\r\n\t\t\tprintResult(forecasts, outcomes, brierScore);\r\n\r\n\t\t} catch (IOException e) {\r\n\t\t\tSystem.out.println(\"Fehler beim Lesen der JSON-Datei: \" + e.getMessage());\r\n\t\t} catch (Exception e) {\r\n\t\t\tSystem.out.println(\"Fehler: \" + e.getMessage());\r\n\t\t}\r\n\t}\r\n\r\n\t\/**\r\n\t * Methode zur Berechnung des Brier-Wertes.\r\n\t * \r\n\t * &lt;p&gt;\r\n\t * Der Brier-Wert wird wie folgt berechnet:\r\n\t *\r\n\t * &lt;pre&gt;\r\n\t *     Brier-Wert = (1 \/ n) * \u03a3 (forecast\u1d62 - outcome\u1d62)\u00b2\r\n\t * &lt;\/pre&gt;\r\n\t *\r\n\t * wobei:\r\n\t * &lt;ul&gt;\r\n\t * &lt;li&gt;n = Anzahl der Vorhersagen&lt;\/li&gt;\r\n\t * &lt;li&gt;forecast\u1d62 = Wahrscheinlichkeitsvorhersage f\u00fcr das Ereignis i&lt;\/li&gt;\r\n\t * &lt;li&gt;outcome\u1d62 = tats\u00e4chliches Ergebnis des Ereignisses i (1 f\u00fcr eingetreten, 0\r\n\t * f\u00fcr nicht eingetreten)&lt;\/li&gt;\r\n\t * &lt;\/ul&gt;\r\n\t * \r\n\t * @param forecasts Array von Wahrscheinlichkeitsvorhersagen\r\n\t * @param outcomes  Array von tats\u00e4chlichen Ergebnissen (1 f\u00fcr Eintreten, 0 f\u00fcr\r\n\t *                  Nichteintreten)\r\n\t * @return Brier-Wert als double\r\n\t *\/\r\n\tpublic static double berechneBrierScore(double[] forecasts, int[] outcomes) {\r\n\t\tif (forecasts.length != outcomes.length) {\r\n\t\t\tthrow new IllegalArgumentException(\"Vorhersagen und Ergebnisse m\u00fcssen die gleiche L\u00e4nge haben.\");\r\n\t\t}\r\n\r\n\t\tdouble totalError = 0.0;\r\n\t\tint n = forecasts.length;\r\n\r\n\t\tfor (int i = 0; i &lt; n; i++) {\r\n\t\t\tdouble error = forecasts[i] - outcomes[i];\r\n\t\t\ttotalError += error * error;\r\n\t\t}\r\n\t\treturn totalError \/ n; \/\/ Durchschnittlicher quadratischer Fehler\r\n\t}\r\n\r\n\t\/**\r\n\t * Methode zur Ausgabe der Vorhersagen und Ergebnisse als Tabelle\r\n\t * \r\n\t * @param forecasts  Array mit Wahrscheinlichkeitsvorhersagen\r\n\t * @param outcomes   Array mit tats\u00e4chlichen Ergebnissen (1 oder 0)\r\n\t * @param brierScore der berechnete Brier-Wert\r\n\t *\/\r\n\tpublic static void printResult(double[] forecasts, int[] outcomes, double brierScore) {\r\n\t\tif (forecasts.length != outcomes.length) {\r\n\t\t\tSystem.err.println(\"Fehler: Die Arrays 'forecasts' und 'outcomes' m\u00fcssen dieselbe L\u00e4nge haben.\");\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tSystem.out.printf(\"%-10s %-15s %-10s%n\", \"Index\", \"Vorhersage\", \"Ergebnis\");\r\n\t\tSystem.out.println(\"-------------------------------------\");\r\n\r\n\t\t\/\/ Durch die Arrays iterieren und die Daten ausgeben\r\n\t\tfor (int i = 0; i &lt; forecasts.length; i++) {\r\n\t\t\tSystem.out.printf(\"%-10d %-15.2f %-10d%n\", i + 1, forecasts[i], outcomes[i]);\r\n\t\t}\r\n\r\n\t\tSystem.out.println(\"-------------------------------------\");\r\n\t\tSystem.out.printf(\"Brier-Wert: %.4f%n\", brierScore);\r\n\t}\r\n}\r\n<\/pre>\n<p>F\u00fcr die pom.xml brauchen wir noch die JSon-Libs:<\/p>\n<pre class=\"lang:xhtml decode:true \" >&lt;dependency&gt;\r\n&lt;!-- F\u00fcr den BrierScoreCalculator--&gt;\r\n\t&lt;groupId&gt;org.json&lt;\/groupId&gt;\r\n\t&lt;artifactId&gt;json&lt;\/artifactId&gt;\r\n\t&lt;version&gt;20210307&lt;\/version&gt;\r\n&lt;\/dependency&gt;<\/pre>\n<p>Wenn wir das Programm nun mit Java 21 starten, k\u00f6nnen wir die Java-Datei direkt auf der CMD aufrufen (oder in der IDE starten), dazu in der Verzeichnis mit der BrierScoreCalculator.java gehen und:<\/p>\n<p><strong>java -cp .m2\/repository\/org\/json\/json\/20210307\/json-20210307.jar BrierScoreCalculator.java \/Users\/pi\/eclipse-workspace-2024\/twmathe\/input-brier-score-wetter.json<\/strong><\/p>\n<p>Wir erhalten dann als Ergebnis:<\/p>\n<pre class=\"lang:default decode:true \" >\r\nIndex      Vorhersage      Ergebnis  \r\n-------------------------------------\r\n1          0,71            1         \r\n2          0,71            1         \r\n3          0,70            1         \r\n4          0,68            0         \r\n5          0,64            1         \r\n6          0,65            1         \r\n7          0,67            0         \r\n-------------------------------------\r\nBrier-Wert: 0,2031\r\n<\/pre>\n<p>Eine JUnit Testmethode k\u00f6nnte so aussehen:<\/p>\n<pre class=\"lang:java decode:true \" >@Test\r\n\tvoid berechneBrierScore() {\r\n\r\n\t\tdouble[] forecasts = { 0.71, 0.71, 0.7, 0.68, 0.64, 0.65, 0.67 };\r\n\t\tint[] outcomes = { 1, 1, 1, 0, 1, 1, 0 };\r\n\t\tassertEquals(0.2030857142857143, BrierScoreCalculator.berechneBrierScore(forecasts, outcomes));\r\n\t}\r\n<\/pre>\n<p>Das ganze Projekt gibt es auf meinem <a href=\"https:\/\/gitlab.com\/IT-Berater\/twmathe\">GitLab-Repo<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Der Brier-Wert ist ein effizientes und einfaches Ma\u00df zur Bewertung der Genauigkeit probabilistischer Vorhersagen. Durch die Kombination aus einfacher Berechnung und aussagekr\u00e4ftiger Analyse ist er ein weit verbreitetes Werkzeug in der Statistik und im maschinellen Lernen. In der Praxis hilft er, die Qualit\u00e4t von Vorhersagen quantitativ zu bewerten und kann zur Verbesserung von Modellen und &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/blog.wenzlaff.de\/?p=22132\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eDer Brier-Score (Brier-Wert) nicht nur f\u00fcr Prognostiker\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","footnotes":""},"categories":[220,3897,79,2713],"tags":[783,6055,6056,2178,6053,170,6054,581],"class_list":["post-22132","post","type-post","status-publish","format-standard","hentry","category-anleitung","category-java-programmierung","category-programmierung","category-statistik","tag-berechnen","tag-brier-scor","tag-brier-wert","tag-java","tag-prognostiker","tag-rechnen","tag-score","tag-statistik"],"_links":{"self":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/22132","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=22132"}],"version-history":[{"count":0,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/22132\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=22132"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=22132"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=22132"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}