Fehlermeldung bei StratifiedShuffleSplit

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
nichtSoGuter
User
Beiträge: 92
Registriert: Mittwoch 13. April 2022, 17:40

ich erhalte folgenden Fehlermeldung bei dem untenstehenden code:
KeyError: '[193, 85, 39, 58, 274, 120, 152, 176, 320, 300, 37, 121, 130, 253, 12, 87, 315, 161, 46, 201, 278, 178, 237, 92, 65, 224, 243, 187, 231, 213] not in index'

Code: Alles auswählen

import pandas as pd
import numpy as np

from sklearn.model_selection import StratifiedShuffleSplit

def split_in_train_val_test(dataframe_was_gesplittet_werden_soll, größe_der_kleinen_gruppen = 0.1, spaltenname_nach_der_gesplittet_werden_soll="Kategorienummer"):

  aufteilungsgruppen = dataframe_was_gesplittet_werden_soll[spaltenname_nach_der_gesplittet_werden_soll].copy()
  aufteilung = StratifiedShuffleSplit(n_splits=1, test_size=größe_der_kleinen_gruppen, random_state=0)

  for große_gruppe_id, kleine_gruppe_id in aufteilung.split(dataframe_was_gesplittet_werden_soll, aufteilungsgruppen):
    große_gruppe = dataframe_was_gesplittet_werden_soll.loc[große_gruppe_id]
    kleine_gruppe = dataframe_was_gesplittet_werden_soll.loc[kleine_gruppe_id]

  return große_gruppe, kleine_gruppe

main_data, test_data = split_in_train_val_test(df)
train_data, validation_data = split_in_train_val_test(main_data)
ohne die folgende Codezeile funktioniert alles super

Code: Alles auswählen

train_data, validation_data = split_in_train_val_test(main_data)
nichtSoGuter
User
Beiträge: 92
Registriert: Mittwoch 13. April 2022, 17:40

ich habe statt .loc --> iloc verwendet. damit hat es funkioniert
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Das

Code: Alles auswählen

return große_gruppe, kleine_gruppe
liefert dir nur die große_gruppe und kleine_gruppe des letzten Schleifendurchlaufs zurück. Was ist mit all den anderen?
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
nichtSoGuter
User
Beiträge: 92
Registriert: Mittwoch 13. April 2022, 17:40

da n_splits=1 ist, wird der dataframe nur einmal gesplittet. Die .splitt() methode gibt ein <generator object BaseShuffleSplit.split> objekt zurück welches mit der for schleife iteriert wird.
Also gibt es keine anderen gruppen außer "große_gruppe" und "kleine_gruppe" glaube ich. oder verstehe ich etwas falsch?

Und danke für die antwort
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@nichtSoGuter: Dann macht die ``for``-Schleife keinen Sinn und verwirrt den Leser nur. Das wäre ein Fall für `more_itertools.one()`. Das ist nicht nur verständlicher, sondern das testet auch ob es tatsächlich exakt *ein* Element gibt, und löst eine Ausnahme aus, falls dem nicht so ist.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
nichtSoGuter
User
Beiträge: 92
Registriert: Mittwoch 13. April 2022, 17:40

Danke. alles funktioniert jetzt.
Das ist der code dazu, falls jemand das selbe problem haben sollte

Code: Alles auswählen

def split_in_train_val_test(dataframe_was_gesplittet_werden_soll, größe_der_kleinen_gruppen = 0.1, spaltenname_nach_der_gesplittet_werden_soll="Kategorienummer"):

  aufteilungsgruppen = dataframe_was_gesplittet_werden_soll[spaltenname_nach_der_gesplittet_werden_soll].copy()
  aufteilung = StratifiedShuffleSplit(n_splits=1, test_size=größe_der_kleinen_gruppen, random_state=0)

  rückgabe_objekt_der_split_methode = aufteilung.split(dataframe_was_gesplittet_werden_soll, aufteilungsgruppen)
  großer_set_id, kleiner_set_id = more_itertools.one(rückgabe_objekt_der_split_methode)
  großer_set = dataframe_was_gesplittet_werden_soll.iloc[großer_set_id]
  kleiner_set = dataframe_was_gesplittet_werden_soll.iloc[kleiner_set_id]
  return großer_set ,kleiner_set
Antworten