[PYTHON] Train_test_split des Feature-Betrags, der von dict gehalten wird

Was du machen willst

Der im Wörterbuchtyp enthaltene Funktionsbetrag, wie unten gezeigt

{'field1': array([0, 1, 2, 3, 4, 5]), 'field2': array([5, 4, 3, 2, 1, 0]), 'label': array([1, 0, 1, 0, 0, 0])}

Ich möchte unter Beibehaltung des Wörterbuchtyps wie unten gezeigt teilen

{'field1': array([4, 0, 3]), 'field2': array([1, 5, 2]), 'label': array([0, 1, 0])}
{'field1': array([5, 1, 2]), 'field2': array([0, 4, 3]), 'label': array([0, 0, 1])}

Weise

Es ist ziemlich schwierig, Optionen wie das Extrahieren unter Berücksichtigung der Klassenverteilung selbst zu implementieren. Erstellen Sie daher einen Prozess, der model_selection.train_test_split von scikit-learn umschließt. Es war möglich, ein zufälliges Indexarray zu erstellen, es mit train_test_split mit dem Label-Array zu teilen und aus jedem Array durch Angabe des Index zu extrahieren.

class Splitter:
    def __init__(self, train_size, label_col: str):
        self.train_size = train_size
        self.label_col = label_col
        self.train_indices = None
        self.test_indices = None

    def set_split_indices(self, field_to_values):
        total_length = len(field_to_values[self.label_col])
        split_indices = np.array(range(total_length))
        labels = field_to_values[self.label_col]
        self.train_indices, self.test_indices, _, _ = train_test_split(
            split_indices, labels, train_size=self.train_size,stratify=labels)

    def split(self, field_to_values):
        train = {field: values[self.train_indices] for field, values in field_to_values.items()}
        test = {field: values[self.test_indices] for field, values in field_to_values.items()}
        return train, test

Ausführungsergebnis

>>> field_to_values = {"field1": np.array([0, 1, 2, 3, 4, 5]), "field2": np.array([5, 4, 3, 2, 1, 0]), "label": np.array([1, 0, 1, 0, 0, 0])}
>>> splitter = Splitter(train_size=0.5, label_col="label")
>>> splitter.set_split_indices(field_to_values)
>>> splitter.split(field_to_values)
({'field1': array([4, 0, 3]), 'field2': array([1, 5, 2]), 'label': array([0, 1, 0])}, {'field1': array([5, 1, 2]), 'field2': array([0, 4, 3]), 'label': array([0, 0, 1])})

Dieses Mal wollte ich mehrere Wörterbücher durch denselben Index teilen, also habe ich es zu einer Klasse gemacht, aber wenn ich es als Funktion schreibe, wird es wie folgt sein

def train_test_split_dict(field_to_values, train_size, label_col: str)
    total_length = len(field_to_values[label_col])
    split_indices = np.array(range(total_length))
    labels = field_to_values[label_col]
    train_indices, test_indices, _, _ = train_test_split(
        split_indices, labels, train_size=train_size, stratify=labels)
    train = {field: values[train_indices] for field, values in field_to_values.items()}
    test = {field: values[test_indices] for field, values in field_to_values.items()}
    return train, test

Recommended Posts

Train_test_split des Feature-Betrags, der von dict gehalten wird
Funktionen der Go-Sprache
Hauptfunktionen von ChainMap
Sortieren nach dikt Typ Wert Wert
Merkmale der Programmiersprache [Memo]
Visualisierung von Daten nach Präfektur
Berechnung der Ähnlichkeit durch MinHash
Über die Funktionen von Python