Python jupyter notebook. Работа по дисциплине Искусственный Интеллект, тема обучения с учителем, проблема в коде
28.11.2024, 16:08. Показов 997. Ответов 0
Здравствуйте, пользователи данного форума, я студент осваивающий дисциплину Искусственный Интеллект, возникла проблема при выполнении работы на тему обучения с учителем, которую сам я решить не в силах. Прошу помочь мне ее исправить. В самой работе используется ИИ для прогнозирования результата.
Задача была поставлена следующим образом: Используя методы классификации, создать модель для классификации объектов датасета по указанному в варианте полю. Достаточно использовать один любой метод классификации (логистическая регрессия, метод опорных векторов, ансамблевая модель). Результаты прогнозирования должны быть отображены на матрице несоответствий и в виде таблицы.
Из исходных данных у меня является датасет с моим вариантом, в котором описаны данные и параметры машинных двигателей и образец работы, по которому я смогу сориентироваться.
Прилагаю свой код работы:
1)Загрузка библиотек и датасета
| Python | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| [CODE]
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import Lasso
from sklearn.linear_model import Ridge
from sklearn.linear_model import ElasticNet
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import cross_validate
from sklearn import metrics
from sklearn.metrics import confusion_matrix
import seaborn as sns
%matplotlib inline
df = pd.read_csv('23 FuelConsumption.csv')
df.info ()
[/CODE] |
|
2)Обработка датасета по требованиям варианта
| Python | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| [CODE]
df=df.drop(['Year'], axis=1)#удаляем поле из-за требований варианта
df=df.drop(['MODEL'], axis=1)#удаляем поле из-за требований варианта
#Удаление пустых объектов не производится вследствии их отсутсвия (везде 639, нулевых обьектов нет)
#Замена текста:
print(df.MAKE.unique())#отображение текста, который надо заменить на цифры
print(df['VEHICLE CLASS'].unique())#отображение текста, который надо заменить на цифры
print(df.TRANSMISSION.unique())#отображение текста, который надо заменить на цифры
print(df.FUEL.unique())#отображение текста, который надо заменить на цифры
MAKE = {'ACURA':0, 'AUDI':1, 'BMW':2, 'BUICK':3, 'CADILLAC':4,'CHEVROLET':5, 'CHRYSLER':6, 'DAEWOO':7, 'DODGE':8, 'FERRARI':9, 'FORD':10, 'GMC':11, 'HONDA':12, 'HYUNDAI':13, 'INFINITI':14, 'ISUZU':15, 'JAGUAR':16, 'JEEP':17, 'KIA':18, 'LAND ROVER':19, 'LEXUS':20, 'LINCOLN':21, 'MAZDA':22, 'MERCEDES-BENZ':23, 'NISSAN':24, 'OLDSMOBILE':25, 'PLYMOUTH':26, 'PONTIAC':27, 'PORSCHE':28, 'SAAB':29, 'SATURN':30, 'SUBARU':31, 'SUZUKI':32, 'TOYOTA':33, 'VOLKSWAGEN':34, 'VOLVO':35,}#замена текста на цифры
VEHICLE_CLASS = {'COMPACT':0, 'MID-SIZE':1, 'SUBCOMPACT':2, 'STATION WAGON - MID-SIZE':3, 'MINICOMPACT':4, 'TWO-SEATER':5, 'STATION WAGON - SMALL':6, 'FULL-SIZE':7, 'SUV':8, 'VAN - CARGO':9, 'VAN - PASSENGER':10, 'PICKUP TRUCK - STANDARD':11, 'PICKUP TRUCK - SMALL':12, 'MINIVAN':13,}#замена текста на цифры
TRANSMISSION = {'A4':0, 'M5':1, 'AS5':2, 'AS4':3, 'M6':4, 'A5':5, 'A3':6, 'AS6':7,}#замена текста на цифры
FUEL = {'X':0, 'Z':1, 'E':2, 'N':3, 'D':4,}#замена текста на цифры
df=df.replace(MAKE)#перезапись данных в переменную
df=df.replace(VEHICLE_CLASS)#перезапись данных в переменную
df=df.replace(TRANSMISSION)#перезапись данных в переменную
df=df.replace(FUEL)#перезапись данных в переменную
[/CODE] |
|
3)Создание выборок
| Python | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| [CODE]
# Для прогнозирования
df_reg_data=df.drop(['FUEL CONSUMPTION'], axis=1)#все поля, кроме прогназируемого (выкинули поле прогназирования)
df_reg_target=df['FUEL CONSUMPTION']#только поле, которое прогназируем (выбрали только поле прогназирования)
# Для классификации
df_cl_data=df.drop(['MAKE'], axis=1)#все поля, кроме классифицируемого (выкинули поле прогназирования)
df_cl_target=df['MAKE']#только поле, которое классифицируем (выбрали только поле прогназирования)
# Теперь деление на входные и выходные обучающие и тестовые
data_train_reg, data_test_reg, target_train_reg, target_test_reg = train_test_split(
df_reg_data, df_reg_target,
test_size=0.3, random_state=42 #делим на 30% и перемешеваем, чтобы разнообразные данные попали
)
# делим переменные из прошлого блока на части: тренировочную (на которой программа учится) и тестовую (через которую программа предсказывает),
# в соотношении 70/30
data_train_cl, data_test_cl, target_train_cl, target_test_cl = train_test_split(
df_cl_data, df_cl_target,
test_size=0.3, random_state=42
)
# делим переменные из прошлого блока на части: тренировочную (на которой программа учится) и тестовую (через которую программа предсказывает),
# в соотношении 70/30
[/CODE] |
|
3) Классификация методом логистической регрессии
| Python | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| [CODE]
data_train_log, data_test_log, target_train_log, target_test_log = train_test_split(
df_cl_data, df_cl_target,
test_size=0.3, random_state=17
)
logistic_regression = LogisticRegression(solver='newton-cg', max_iter=200) # Увеличиваем max_iter до 200
model_log=logistic_regression.fit(data_train_cl,target_train_cl)
predicted_log = model_log.predict(data_test_cl)
# создаем табличку из двух колонок Предсказаные значения и Реальные значения
results_table = pd.DataFrame(list(zip(predicted_log, target_test_cl)))
results_table.columns = ['Предсказано', 'На самом деле']
print(results_table)
confusion_scores = confusion_matrix(target_test_cl, predicted_log)
confusion_df = pd.DataFrame(confusion_scores, columns=np.sort(target_test_cl.unique()), index=np.sort(target_test_cl.unique()))
# Не забудьте подписать классы
labels = ['ACURA,AUDI,BMW,BUICK,CADILLAC,CHEVROLET,CHRYSLER,DAEWOO,DODGE,FERRARI,FORD,GMC,HONDA,HYUNDAI,INFINITI,ISUZU,JAGUAR,JEEP,KIA,LAND ROVER,LEXUS,LINCOLN,MAZDA,MERCEDES-BENZ,NISSAN,OLDSMOBILE,PLYMOUTH,PONTIAC,PORSCHE,SAAB,SATURN,SUBARU,SUZUKI,TOYOTA,VOLKSWAGEN,VOLVO']
sns.heatmap(confusion_df, annot=True,xticklabels=labels,yticklabels=labels).plot()
[/CODE] |
|
Выведенные данные:
Предсказано На самом деле
0 5 5
1 24 15
2 33 33
3 9 9
4 35 35
.. ... ...
187 1 35
188 11 11
189 11 5
190 27 27
191 2 23
[192 rows x 2 columns]
Ошибка происходит в этом участке кода:
| Python | 1
2
3
4
5
6
7
| [CODE]
confusion_scores = confusion_matrix(target_test_cl, predicted_log)
confusion_df = pd.DataFrame(confusion_scores, columns=np.sort(target_test_cl.unique()), index=np.sort(target_test_cl.unique()))
# Не забудьте подписать классы
labels = ['ACURA,AUDI,BMW,BUICK,CADILLAC,CHEVROLET,CHRYSLER,DAEWOO,DODGE,FERRARI,FORD,GMC,HONDA,HYUNDAI,INFINITI,ISUZU,JAGUAR,JEEP,KIA,LAND ROVER,LEXUS,LINCOLN,MAZDA,MERCEDES-BENZ,NISSAN,OLDSMOBILE,PLYMOUTH,PONTIAC,PORSCHE,SAAB,SATURN,SUBARU,SUZUKI,TOYOTA,VOLKSWAGEN,VOLVO']
sns.heatmap(confusion_df, annot=True,xticklabels=labels,yticklabels=labels).plot()
[/CODE] |
|
Подробное описание ошибки:
| Pascal | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
| [CODE]ValueError Traceback (most recent call last)
Cell In[154], line 2
1 confusion_scores = confusion_matrix(target_test_cl, predicted_log)
----> 2 confusion_df = pd.DataFrame(confusion_scores, columns=np.sort(target_test_cl.unique()), index=np.sort(target_test_cl.unique()))
3 # Не забудьте подписать классы
4 labels = ['ACURA,AUDI,BMW,BUICK,CADILLAC,CHEVROLET,CHRYSLER,DAEWOO,DODGE,FERRARI,FORD,GMC,HONDA,HYUNDAI,INFINITI,ISUZU,JAGUAR,JEEP,KIA,LAND ROVER,LEXUS,LINCOLN,MAZDA,MERCEDES-BENZ,NISSAN,OLDSMOBILE,PLYMOUTH,PONTIAC,PORSCHE,SAAB,SATURN,SUBARU,SUZUKI,TOYOTA,VOLKSWAGEN,VOLVO']
File ~\AppData\Local\Programs\Python\Python313\Lib\site-packages\pandas\core\frame.py:827, in DataFrame.__init__(self, data, index, columns, dtype, copy)
816 mgr = dict_to_mgr(
817 # error: Item "ndarray" of "Union[ndarray, Series, Index]" has no
818 # attribute "name"
(...)
824 copy=_copy,
825 )
826 else:
--> 827 mgr = ndarray_to_mgr(
828 data,
829 index,
830 columns,
831 dtype=dtype,
832 copy=copy,
833 typ=manager,
834 )
836 # For data is list-like, or Iterable (will consume into list)
837 elif is_list_like(data):
File ~\AppData\Local\Programs\Python\Python313\Lib\site-packages\pandas\core\internals\construction.py:336, in ndarray_to_mgr(values, index, columns, dtype, copy, typ)
331 # _prep_ndarraylike ensures that values.ndim == 2 at this point
332 index, columns = _get_axes(
333 values.shape[0], values.shape[1], index=index, columns=columns
334 )
--> 336 _check_values_indices_shape_match(values, index, columns)
338 if typ == "array":
339 if issubclass(values.dtype.type, str):
File ~\AppData\Local\Programs\Python\Python313\Lib\site-packages\pandas\core\internals\construction.py:420, in _check_values_indices_shape_match(values, index, columns)
418 passed = values.shape
419 implied = (len(index), len(columns))
--> 420 raise ValueError(f"Shape of passed values is {passed}, indices imply {implied}")
ValueError: Shape of passed values is (33, 33), indices imply (32, 32)[/CODE] |
|
На сколько я понимаю, матрица несоответствий не может быть построена из-за разного размера.
| Python | 1
2
3
4
| [CODE]
print(np.sort(target_test_cl.unique())) # Сколько уникальных классов?
print(len(confusion_scores)) # матрица с количеством классов target_test_cl
[/CODE] |
|
Ответ программы:
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 20 22 23 24 25
27 28 29 30 31 33 34 35]
33
Т.е. матрица confusion_scores должна быть равна количеству классов target_test_cl. Но почему то это не так, 35=33. Следовательно возникает ошибка. Также indices imply (32, 32), а должно быть также 35, насколько я понимаю.
Прошу помогите, как это можно исправить и из-за чего может подобное возникать?
0
|