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

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

  1. Сначала я восполню недостающие значения условия, оценив их исходя из количества пройденных километров.
`
new_condition_df = df[df['condition'].map(condition_mapping) == 2]
top_1000_highest_mileage = new_condition_df.nlargest(1000, 'mileage')['mileage']
average_top_1000_highest_mileage = top_1000_highest_mileage.mean()

# Filter the DataFrame for rows where condition is null or unspecified
null_condition_df = df[df['condition'].isnull() | (df['condition'] == '')]

# Update 'condition' based on mileage condition
null_condition_df.loc[null_condition_df['mileage'] >= average_top_1000_highest_mileage, 'condition'] = 'CONDITION_USED'
null_condition_df.loc[null_condition_df['mileage'] < average_top_1000_highest_mileage, 'condition'] = 'CONDITION_NEW'

# Update the original DataFrame with the modified rows
df.update(null_condition_df)
`
  1. Удаление нескольких пустых строк
columns_with_null = ['color', 'vat_reclaimable', 'cubic_capacity', 'seller_country', 'feature']
df.dropna(subset=columns_with_null, inplace=True)

df['air_conditioning'].fillna('AIRCONDITIONING_NONE', inplace=True)
df['parking_camera'].fillna('PARKINGCAMERA_NONE', inplace=True)
df['parking_sensors'].fillna('PARKINGSENZOR_NONE', inplace=True)
  1. Здесь я пытаюсь оценить недостающие значения для столбца привода, который содержит информацию о том, является ли машина 4х4 или 4х2, привод содержит большое количество нулевых значений, поэтому я оцениваю его таким сложным способом
features = ['mileage', 'cubic_capacity', 'power', 'year'] + list(df.columns[df.columns.str.startswith('car_style_')]) + list(df.columns[df.columns.str.startswith('transmission_')]) + list(df.columns[df.columns.str.startswith('fuel_type_')])

train_data = df.dropna(subset=['drive'])  # Odstranění řádků s chybějícími hodnotami sloupce 'drive'
X_train, X_test, y_train, y_test = train_test_split(train_data[features], pd.get_dummies(train_data['drive']), test_size=0.2, random_state=42)

model = LinearRegression()
model.fit(X_train, y_train)

missing_data = df[df['drive'].isnull()]
X_missing = missing_data[features]
predicted_values = model.predict(X_missing)


df_imputed = df.copy()
predicted_df = pd.DataFrame(predicted_values, columns=y_train.columns, index=missing_data.index)
df_imputed.loc[df_imputed['drive'].isnull(), y_train.columns] = predicted_df.values

predicted_df_encoded = pd.DataFrame(predicted_values, columns=y_train.columns, index=missing_data.index)
predicted_df_encoded = (predicted_df_encoded > 0.5).astype(int)

for column in predicted_df_encoded.columns:
    df_imputed[column] = 0  # Přidání sloupce se všemi hodnotami 0
    df_imputed.loc[predicted_df_encoded.index, column] = predicted_df_encoded[column].values  

unique_values_imputed_encoded = df_imputed['drive'].unique()
df = df_imputed
df.drop(columns=['drive'], inplace=True)
  1. Здесь я кодирую поле функции
from sklearn.preprocessing import MultiLabelBinarizer

mlb = MultiLabelBinarizer()
df = df.join(pd.DataFrame(mlb.fit_transform(df['feature']),columns=mlb.classes_))
df.fillna(0, inplace=True)

df = df.drop(columns=['feature'])
  1. Само обучение
df_encoded = pd.get_dummies(df)

X_train, X_test, y_train, y_test = train_test_split(df_encoded.drop(columns=['price_with_vat_czk']), df_encoded['price_with_vat_czk'], test_size=0.25, random_state=42)

model = LinearRegression()
model.fit(X_train, y_train)

y_pred = model.predict(X_test)

Вся программа: https://onecompiler.com/python/42brp9a4r Набор данных https://filetransfer.io/data-package/a0mFEfg4#link

Мой RMSE составляет около 64 тысяч.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
59
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Любой ответ будет коротким, предстоит много дел, и именно в этом, я думаю, и заключается роль одного специалиста по данным. Несколько вопросов, которые вы можете задать себе для начала:

  • Насколько плох RMSE в вашей модели? как ты думаешь, насколько лучше для тебя? С какой целью вы выбираете именно этот показатель, а не какой-либо другой?

Я думаю, что существует некоторый исследовательский анализ недостающих данных, например, вы можете увидеть, что ваша диаграмма рассеяния говорит вам, что, возможно, линейная регрессия - не лучший подход. Я только что попробовал себя с sklearn.ensemble.RandomForestRegressor с гиперпараметрами по умолчанию, и поведение полученного графика стало лучше, RMSE уменьшилось примерно до 45 КБ, а R2 переместился с 0,88 до 0,94 (см. sklearn.metrics.r2_score).

Вы можете, например, получить корреляцию между вашим вектором функций и вашей целью, чтобы увидеть, что происходит с переменными, прежде чем выполнять любую модель, и вы увидите, что это высокая корреляция с «годом»:

df_encoded.corr(method = "spearman")["price_with_vat_czk"].sort_values()

Вы можете попробовать исследовательский анализ данных, чтобы лучше настроить свои функции (статистика — ваш друг), также вы можете попробовать несколько алгоритмов, а после этого поиграть с разными гиперпараметрами (см. sklearn.model_selection.GridSearchCV), затем поместить свои модели в конвейеры и попытаться получить важность функции, чтобы уменьшить размерность количества имеющихся у вас функций (для этого см. SHAP или GINI)... Подводя итог, еще многое предстоит сделать...

Сама идея выглядит неплохо, но теперь вам нужно повторить то, что вы сделали, это самое забавное :). Некоторые вещи, которые вы могли бы попробовать:

  1. Улучшите предварительную обработку: В общем, я бы постарался лучше понять данные, построить их график, проанализировать распределения, увидеть корреляцию. Данные — это друг, а не еда. Вы можете попробовать нормализовать данные (в зависимости от модели, которую вы собираетесь использовать, это имеет большое значение, мало или ничего). Попробуйте удалить выбросы, если их слишком много. Если распределения перекошены (как нормальное распределение, но «перемещены»), вы можете попробовать применить логарифмическое преобразование.

  2. Попробуйте разные модели: Здесь вы можете попробовать много чего. Я бы рекомендовал начать с древовидной модели. По моему личному опыту, XGboost обычно дает действительно хорошие результаты, но я приглашаю вас попробовать разные варианты и изучить разные методы! Если вы действительно хотите набрать очки, вы можете даже собрать свою собственную сборку моделей. То есть обучение, например, 5 разных моделей, каждая со своими сильными и слабыми сторонами, и средний (или что-то в этом роде) результат всех них. Но для этого вам сначала нужно 5 хороших моделей и подумать, улучшит ли их объединение или просто уменьшит RMSE лучшей модели.

Затем вы можете попробовать все скучные вещи: использовать поиск по сетке, чтобы изменить гиперпараметры, такие как скорость обучения, условия регулирования и все такое, но если вы пытаетесь учиться, я бы сказал, что это вторично.

Другие вопросы по теме

Похожие вопросы

Лучший/самый чистый способ структурировать проверку ошибок в динамически выделяемых переменных
Как объединить/объединить две строки после того, как длинные столбцы были неправильно прочитаны в отдельные строки?
Деконструкция кортежа при использовании сортировки с лямбда-функцией по ключу
Поиск лиц с помощью Skimage.measure.marching_cubes возвращает странное смещение, основанное на ограничениях сетки
Вставка с помощью cx_Oracle внезапно занимает вечность, но в sql Developer все в обычное время
Проблема с циклом Python: итерация конечного объема/разности
Самый эффективный способ условно выбрать мой большой df
Модель логистической регрессии — прогнозирование и ROC AUC
Как получить значение эпохи для любого заданного местного времени с часовым поясом и летним временем в Python?
Возникли проблемы с регулярным выражением отрицательного просмотра в Python