Seite 1 von 1

Fehlermeldung bei StratifiedShuffleSplit

Verfasst: Sonntag 2. Oktober 2022, 15:01
von nichtSoGuter
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)

Re: Fehlermeldung bei StratifiedShuffleSplit

Verfasst: Sonntag 2. Oktober 2022, 18:06
von nichtSoGuter
ich habe statt .loc --> iloc verwendet. damit hat es funkioniert

Re: Fehlermeldung bei StratifiedShuffleSplit

Verfasst: Sonntag 2. Oktober 2022, 19:30
von ThomasL
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?

Re: Fehlermeldung bei StratifiedShuffleSplit

Verfasst: Montag 3. Oktober 2022, 13:09
von nichtSoGuter
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

Re: Fehlermeldung bei StratifiedShuffleSplit

Verfasst: Montag 3. Oktober 2022, 15:36
von __blackjack__
@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.

Re: Fehlermeldung bei StratifiedShuffleSplit

Verfasst: Montag 3. Oktober 2022, 17:19
von nichtSoGuter
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