- Вопрос или проблема
- Определите признаки и цель
- Разделите данные на обучающую и тестовую выборки
- Определите квантовую отображение признаков
- Определите квантовое ядро
- Инициализируйте и обучите QSVM
- Сделайте предсказания на тестовой выборке
- Оцените модель
- Сохраните модель в файл
- Загрузите модель из файла
- Сбор данных пользователя для 8 признаков
- Подготовьте входной массив с 8 признаками
- Убедитесь, что входные признаки имеют правильную форму
- Примените то же масштабирование, что и при обучении модели
- Сделайте предсказание, используя обученную модель
- Выведите предсказание
- Ответ или решение
- Теория
- Пример
- Применение
- Заключение
Вопрос или проблема
Я пытаюсь предсказать данные о погоде, используя алгоритм quantum svm. Код работает нормально до предсказания модели, но когда я пытаюсь предсказать выход, возникает следующая ошибка.
ValueError: x_vec и y_vec имеют несовместимые размеры. x_vec имеет 8 измерений, но y_vec имеет 7.
Я сделал признаки обученной модели похожими на признаки нового ввода, но ошибка все равно сохраняется. Что я должен сделать, чтобы решить эту проблему?
Вот полный код.
df = pd.read_csv(file_path)
df.head()
df.describe()
df[‘Formatted Date’] = pd.to_datetime(df[‘Formatted Date’], utc=True)
df1 = df.copy()
df1[‘Year’] = df1[‘Formatted Date’].dt.year
df1[‘Month’] = df1[‘Formatted Date’].dt.month
df1[‘Day’] = df1[‘Formatted Date’].dt.day
df1[‘Hour’] = df1[‘Formatted Date’].dt.hour
df1[‘Minute’] = df1[‘Formatted Date’].dt.minute
df1[‘Second’] = df1[‘Formatted Date’].dt.second
df1.drop(columns=[‘Formatted Date’], inplace=True)
column_order = [‘Year’, ‘Month’, ‘Day’, ‘Hour’, ‘Minute’, ‘Second’] + [col for col in df1.columns if col not in [‘Year’, ‘Month’, ‘Day’, ‘Hour’, ‘Minute’, ‘Second’]]
df1 = df1[column_order]
print(df1)
LE = LabelEncoder()
SS = StandardScaler()
categorical_cols = [‘Summary’, ‘Precip Type’, ‘Daily Summary’]
numerical_cols = [col for col in df1.columns if col not in categorical_cols and col not in [“Year”, “Month”, “Day”, “Hour”, “Minute”, “Second”]]
if len(numerical_cols) > 0:
df1[numerical_cols] = SS.fit_transform(df1[numerical_cols])
for col in categorical_cols:
categorical_data = df1[col]
df1[col] = LE.fit_transform(categorical_data)
Определите признаки и цель
X = df1[[‘Temperature (C)’, ‘Pressure (millibars)’, ‘Daily Summary’, ‘Visibility (km)’,’Wind Bearing (degrees)’,’Wind Speed (km/h)’,’Humidity’]]
y = df1[‘Precip Type’]
Разделите данные на обучающую и тестовую выборки
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=42)
Определите квантовую отображение признаков
feature_map = ZZFeatureMap(feature_dimension=X_train.shape[1], reps=2, entanglement=”linear”)
train_size = 260
X_train = X_train[:train_size]
y_train = y_train[:train_size]
test_size = 70
X_test = X_test[:test_size]
y_test = y_test[:test_size]
Определите квантовое ядро
backend = Aer.get_backend(‘statevector_simulator’)
sampler = Sampler()
fidelity = ComputeUncompute(sampler=sampler)
quantum_kernel = FidelityQuantumKernel(fidelity=fidelity,feature_map=feature_map, sampler=CustomSampler())
quantum_kernel = FidelityQuantumKernel(fidelity=fidelity,feature_map=feature_map, enforce_psd=True, evaluate_duplicates=”off_diagonal”, max_circuits_per_job=None)
Инициализируйте и обучите QSVM
qsvc = QSVC(quantum_kernel=quantum_kernel)
qsvc.fit(X_train, y_train)
Сделайте предсказания на тестовой выборке
y_pred = qsvc.predict(X_test)
Оцените модель
accuracy = np.mean(y_pred == y_test)
print(f’Accuracy: {accuracy}’)
import joblib
Сохраните модель в файл
joblib.dump(qsvc, ‘qsvc_model.pkl’)
print(“Модель сохранена в qsvc_model.pkl”)
Загрузите модель из файла
qsvc_loaded = joblib.load(‘qsvc_model.pkl’)
print(“Модель загружена из qsvc_model.pkl”)
Сбор данных пользователя для 8 признаков
Temperature(C) = float(input(“Введите температуру (C): “))
Humidity = float(input(“Введите влажность: “))
Pressure = float(input(“Введите давление (миллибар): “))
Wind Speed = float(input(“Введите скорость ветра (км/ч): “))
Wind Bearing = float(input(“Введите направление ветра (градусы): “))
Daily Summary = float(input(“Введите закодированное ежедневное описание (0/1/2…): “)) # Пример, кодируйте правильно
Visibility = float(input(“Введите видимость (км): “)) # Включите видимость в ввод
Подготовьте входной массив с 8 признаками
input_features = np.array([[Temperature (C), Pressure (millibars), Daily Summary, Visibility (km),
Wind Bearing (degrees), Wind Speed (km/h), Humidity]])
Убедитесь, что входные признаки имеют правильную форму
print(input_features.shape) # Должно быть (1, 8) для одного предсказания
‘Temperature (C)’, ‘Pressure (millibars)’, ‘Daily Summary’, ‘Visibility (km)’,’Wind Bearing (degrees)’,’Wind Speed (km/h)’,’Humidity’
Примените то же масштабирование, что и при обучении модели
input_features_scaled = SS.transform(input_features) # Используйте SS из обучения
Сделайте предсказание, используя обученную модель
prediction = qsvc.predict(input_features_scaled)
Выведите предсказание
if prediction[0] == 1: # Предполагаем, что 1 означает ‘дождь’ на основе вашего кодирования
print(“Предсказание: Будет дождь ☔”)
else:
print(“Предсказание: Дождя не будет 🌤️”)
Ответ или решение
Тема: Решение проблемы несовместимых размерностей при обучении и предсказании с использованием квантового алгоритма SVM.
Теория
Обучение моделей машинного обучения, включая квантовые методы, требует согласованности размерностей входных данных. Ошибка, как «ValueError: x_vec и y_vec имеют несовместимые размерности», указывает, что количество признаков (или столбцов) передаваемых данных x_vec не совпадает с ожидаемым числом признаков y_vec. Данная ошибка может возникнуть по нескольким причинам, среди которых различия в наборах данных во время обучения и предсказания, неправильная обработка данных, или ошибки при кодировании и маштабировании.
Когда мы говорим о квантовом SVM (QSVM), он строит свою работу на основе квантового вычисления ядра, где размерность признаков имеет решающую роль в корректности построения модели.
Пример
В предоставленном коде наблюдается ошибка, связанная с несовместимостью размерностей. Обучающие данные (X_train) содержат семь признаков: ‘Temperature (C)’, ‘Pressure (millibars)’, ‘Daily Summary’, ‘Visibility (km)’,’Wind Bearing (degrees)’,’Wind Speed (km/h)’,’Humidity’. Однако, в этапе предсказания, некорректно задано число признаков во входном массиве, что становится причиной возникновения ошибки ValueError.
Пример обрабатываемого кода:
input_features = np.array([[Temperature (C), Pressure (millibars), Daily Summary, Visibility (km),
Wind Bearing (degrees), Wind Speed (km/h), Humidity]])
Набор признаков ввода содержит семь признаков, однако выводится, как будто присутствует восемь.
Применение
Для того чтобы решить данную проблему нужно делать несколько шагов:
-
Проверка согласованности входных данных:
- Убедитесь, что количество признаков данных предсказания совпадает с обучающей выборкой.
- В углура лучше включить проверки во время входа для отслеживания и валидации данных на корректную размерность.
-
Автоматизация на этапе подготовки данных:
- Так как входные данные содержат как количественные, так и категориальные признаки, важно удостовериться, что все они проходят одинаковую обработку (например, нормирование и кодирование).
- Примените функции преобразования данных, аналогичные используетсяем при обучении модели, как в случае
StandardScaler
иLabelEncoder
.
-
Логирование процессов IO и данных:
- Настройка логирования этапов ввода и вывода данных может помочь быстро идентифицировать пункт, в котором создается ошибка. Например, распечатайте форму входного массива перед передачей его в модель для проверки на соответствие.
-
Уточнение структуры кода:
- Измените определение
input_features
, чтобы оно соответствовало обучению:input_features = np.array([[Temperature, Pressure, Daily_Summary, Visibility, Wind_Bearing, Wind_Speed, Humidity]])
- Измените определение
-
Уточнение вывода:
- Если одна из функций потеряна, добавьте контрольный вывод размера перед предсказанием.
Заключение
Ошибки, связанные с несовпадением размерностей в машинном обучении, часто возникают из-за человеческого фактора и неправильного понимания предварительной обработки данных. Используя стратегии, описанные в ответе, вы минимизируете ошибки таких же типов и значительно упростите работу с вашими данными. Применение строгих процедур нормализации и валидации поможет избежать подобных проблем в будущем, что позволит сосредоточиться на повышении точности модели и сужать фокус субъективных рабочих моментов возможного кодирования или обработке данных.