Справочная информация о наборе данных

Набор данных, используемый для этого проекта, был собран из UCI Machine Learning Repository. На их веб-сайте есть множество других наборов открытых данных, от небольших до крупных, для проектов машинного обучения. Наш набор данных об автомобилях содержит информацию об автомобилях. Что касается наблюдений, размер данных относительно невелик: 205 наблюдений и 26 столбцов. Информация об этом наборе данных была собрана с 1985. Он содержит информацию о многих технических аспектах автомобилей, таких как мощность в лошадиных силах, объем двигателя, мили на галлон и т. Д. Большинство этих значений являются непрерывными, что делает эти данные очень подходящими для регрессионной модели. Хотя есть и категориальные столбцы, такие как расположение двигателя и производитель автомобиля.

Подход к проекту

При реализации этого проекта машинного обучения был использован простой подход. Этот проект должен дать базовое введение в использование регрессионной модели k-ближайшего соседа. Мы пытаемся спрогнозировать цену автомобиля исходя из его характеристик. Следовательно, целевая переменная является непрерывной. Следовательно, мы используем регрессионную модель вместо модели классификации, которая имеет дело с категориальными значениями в целевом столбце.

Процесс очистки данных

Во-первых, нам нужно прочитать набор данных как фрейм данных pandas и отобразить первые несколько строк, чтобы увидеть, как выглядит набор данных. Строки индекса не было, поэтому нам пришлось вручную создать список имен столбцов с веб-сайта, с которого были собраны данные. Каждый элемент списка должен правильно соответствовать нужной информации в каждом столбце.

cars = pd.read_csv('imports-85.data', names=cols)
cars.head()

Поскольку мы использовали регрессионную модель k-ближайшего соседа, нам не потребовались столбцы с категориальными значениями. Поэтому нам пришлось удалить эти столбцы и создать новый фрейм данных только с числовыми столбцами. Это связано с тем, что при прогнозировании непрерывного значения в качестве метрики сходства используется евклидово расстояние. K-ближайший сосед вычисляет евклидово расстояние, чтобы найти сходство между наблюдениями, и усредняет их, чтобы предсказать невидимое наблюдение.

Евклидово расстояние - наиболее распространенное использование меры расстояния. Евклидово расстояние между двумя точками - это длина пути, соединяющего их. Теорема Пифагора дает это расстояние между двумя точками.

После, наблюдая за некоторыми строками в новом фрейме данных, состоящем только из чисел, мы увидели, что есть некоторые строки со значением «?». Нам пришлось заменить такие значения на null, чтобы мы могли выполнять числовые операции с нашими столбцами функций.

numeric_cars = numeric_cars.replace('?', np.nan)
numeric_cars = numeric_cars.astype('float')

Удаление / вменение пропущенных значений

После того, как мы очистили и преобразовали наши столбцы в типы с плавающей запятой, мы наконец смогли увидеть недостающие значения в наших различных столбцах. Мы удалили все наблюдения с пропущенными значениями в целевом столбце. В некоторых функциях было несколько пропущенных значений, мы присвоили этим значениям среднее значение соответствующих столбцов. Если большая часть данных отсутствовала в столбце, мы могли бы полностью удалить его. Следующим шагом будет этап моделирования.

numeric_cars = numeric_cars.dropna(subset=['price'])
numeric_cars = numeric_cars.fillna(numeric_cars.mean())

Одномерная модель

Нам пришлось нормализовать наши столбцы функций, прежде чем мы сможем приспособить к ним модель машинного обучения. В противном случае дисперсия значений в каждом столбце отличается друг от друга, что не идеально для нашей модели. Поэтому нам пришлось масштабировать данные, чтобы все значения представляли стандартные отклонения от среднего значения столбца. Кроме того, нам пришлось разделить набор данных на две половины, одна из которых представляет собой тестовый набор, а другая - обучающий набор. Мы сделали это после рандомизации порядка наблюдений в наборе данных.

knn = KNeighborsRegressor()
knn.fit(train_df[[train_col]], train_df[target_col])
predictions = knn.predict(test_df[[train_col]])
mse = mean_squared_error(test_df[target_col], predictions)
rmse = np.sqrt(mse)

Сначала мы использовали одномерную модель. Это относится к использованию одного столбца функций для прогнозирования цели. Используя цикл for, мы просмотрели все столбцы функций, чтобы увидеть, в каком столбце были лучшие прогнозы цены.

Мы использовали метрику оценки под названием Среднеквадратичная ошибка, чтобы проверить точность нашего прогноза. Есть и другие метрики, которые мы могли бы использовать, каждая со своими преимуществами и недостатками. Например, RMSE помогает нам идентифицировать более высокие значения ошибок, но MAE более интерпретируемо.

Нашим следующим шагом было изменение K или количества ближайших соседей, которые модель использовала для своих прогнозов. Мы перебирали значения от 1 до 9 и смотрели, как работает каждый столбец. В большинстве случаев функции лучше работали при K между 3: 6. Модель KNeighborsRegressor использует значение по умолчанию 5.

Многомерная модель

Мы повторили вышеупомянутую процедуру для одномерной модели, за исключением того, что на этот раз мы использовали более одной функции, чтобы сделать наши прогнозы. Мы итеративно использовали 2: 7 наших лучших функций, чтобы определить, какое количество функций лучше всего использовать для получения наименьшего значения RMSE. Удивительно, но лучшие результаты были получены при использовании только двух лучших функций. Для нашего следующего и последнего шага мы включили различные значения k, используя цикл for, чтобы определить, какая будет лучшая окончательная модель в нашем проекте.

Заключение

Из графика слева мы можем сделать вывод, что использование только двух наших лучших функций со значением k два / три дает нам наилучшие прогнозы. Есть дальнейшие шаги, которые мы могли бы предпринять, такие как введение k-кратной перекрестной проверки для дальнейшей оценки наших моделей. Для дальнейшего изучения показателей сходства это тот блог, на который я ссылался, и для сравнения между RMSE и MAE этот блог был очень полезен.