Как исправить ошибку, чтобы я мог реализовать машину больцмена?

Рейтинг: 0Ответов: 1Опубликовано: 01.05.2023

Я написал простой скрипт, который должен обучиться на основе моего датасета, получать данные, и отдавать самый близкий к ним результат. Вот мой основной код:

import pandas as pd
from sklearn.preprocessing import LabelEncoder
from sklearn.neighbors import NearestNeighbors

# загрузить данные
data = pd.read_csv("dataset.csv", delimiter=";")

# разделить признаки и метки
X = data.drop(columns=["diagnosis"])
y = data["diagnosis"]

# преобразовать категориальные признаки в числовые
le = LabelEncoder()
X["gender"] = le.fit_transform(X["gender"])
X["allergy"] = le.fit_transform(X["allergy"])
X["complication"] = le.fit_transform(X["complication"])
X["difficulty"] = le.fit_transform(X["difficulty"])

# проверить, есть ли новые значения, которых нет в данных для обучения
new_data = pd.DataFrame({
    "age": [20, 30, 40],
    "gender": ["Male", "Female", "Female"],
    "allergy": ["None", "Penicillin", "None"],
    "complication": ["None", "None", "Diabetes"],
    "difficulty": ["Easy", "Medium", "Hard"]
})

for col in new_data.select_dtypes(include=["object"]).columns:
    unseen = set(new_data[col]) - set(le.classes_)
    if len(unseen) > 0:
        raise ValueError(f"The following unseen values were found in column '{col}': {unseen}")


# преобразовать категориальные признаки в числовые
new_data["gender"] = le.transform(new_data["gender"])
new_data["allergy"] = le.transform(new_data["allergy"])
new_data["complication"] = le.transform(new_data["complication"])
new_data["difficulty"] = le.transform(new_data["difficulty"])

# преобразовать категориальные признаки в числовые
for col in new_data.select_dtypes(include=["object"]).columns:
    new_data[col] = le.transform(new_data[col])

# проверить, есть ли новые значения, которых нет в данных для обучения
for col in new_data.select_dtypes(include=["object"]).columns:
    unseen = set(new_data[col]) - set(le.classes_)
    if len(unseen) > 0:
        raise ValueError(f"The following unseen values were found in column '{col}': {unseen}")

# добавить новые данные в исходный набор данных
X = pd.concat([X, new_data], ignore_index=True)

# преобразовать категориальные признаки в числовые
for col in X.select_dtypes(include=["object"]).columns:
    X[col] = le.fit_transform(X[col])

# инициализировать модель KNN
model = NearestNeighbors(n_neighbors=3)

# обучить модель на данных
model.fit(X)

# получить ближайших соседей для новых данных
distances, indices = model.kneighbors(X[new_data_indices])

# вывести результат
for i, neighbors in enumerate(indices):
    print(f"Nearest neighbors for new data point {i + 1}:")
    for neighbor in neighbors:
        print(data.iloc[neighbor])
    print()

А вот мой датасет:

age;gender;allergy;complication;difficulty;diagnosis
1;Test;Test;Test;Test;Test
2;Test;Test;Test;Test;Test
3;Test;Test;Test;Test;Test
4;Test;Test;Test;Test;Test
5;Test;Test;Test;Test;Test
6;Test;Test;Test;Test;Test
7;Test;Test;Test;Test;Test
8;Test;Test;Test;Test;Test
9;Test;Test;Test;Test;Test
10;Test;Test;Test;Test;Test
18;Female;Отсутствует;None;Easy;Diabetes
22;Male;Penicillin;None;Medium;Diabetes
45;Female;Отсутствует;Diabetes;Hard;Diabetes
10;Female;Отсутствует;Diabetes;Hard;Diabetes
30;Male;Отсутствует;Asthma;Medium;Diabetes
55;Female;Sulfa;None;Hard;Diabetes

Как исправить ошибку:

Traceback (most recent call last):
  File "test.py", line 30, in <module>
    raise ValueError(f"The following unseen values were found: {unseen}")
ValueError: The following unseen values were found: {'Diabetes', 40, 'Penicillin', 'None', 20, 'Female', 'Male', 30}

Ответы

▲ 0Принят

Ваша программа работает ровно так, как вы ее написали. Перед строчкой 30 кода срабатывает "написанное вами" условие, которое проверяет входные данные и в строчеке 30 выдается "написанное вами-же" сообщение об ошибке.

Для начала, в set(new_data[col]) у вас находятся данные {'Female', 'Male'}, в set(le.classes_) - {'Easy', 'Hard', 'Medium', 'Test'}, после вычитания unseen = set(new_data[col]) - set(le.classes_) получаем в unseen значение {'Female', 'Male'}, и после определения его длины - len(unseen) срабатывает условие о выдаче ошибки.

А вот что вы этой проверкой хотели достичь - это уже решать вам самим.

P.S. И еще очень странно то, что сообщение об ошибке, которое вы привели в вопросе, не соответствует сообщению об ошибке, которое в действительности выдает ваш код если его запустить.