Вопрос или проблема
Я использую книгу и видео, чтобы научиться использовать метод KNN для классификации фильмов по их жанрам. Вот мой код:
import numpy as np
import pandas as pd
r_cols = ['user_id', 'movie_id', 'rating']
ratings = pd.read_csv('C:/Users/dell/Downloads/DataScience/DataScience-Python3/ml-100k/u.data', sep='\t', engine="python", names=r_cols, usecols=range(3)) # Файл u.data из MovieLens
print(ratings.head())
movieProperties = ratings.groupby('movie_id').agg({'rating': [np.size, np.mean]})
print(movieProperties.head())
movieNumRatings = pd.DataFrame(movieProperties['rating']['size'])
movieNormalizedNumRatings = movieNumRatings.apply(lambda x: (x - np.min(x)) / (np.max(x) - np.min(x)))
print(movieNormalizedNumRatings.head())
movieDict = {}
with open('C:/Users/dell/Downloads/DataScience/DataScience-Python3/ml-100k/u.item') as f: # Файл u.item из MovieLens
temp = ''
for line in f:
fields = line.rstrip('\n').split('|')
movieID = int(fields[0])
name = fields[1]
genres = fields[5:25]
genres = map(int, genres)
movieDict[movieID] = (name, genres,
movieNormalizedNumRatings.loc[movieID].get('size'), movieProperties.loc[movieID].rating.get('mean'))
print(movieDict[1])
from scipy import spatial
def ComputeDistance(a, b):
genresA = a[1]
genresB = b[1]
genreDistance = spatial.distance.cosine(genresA, genresB)
popularityA = a[2]
popularityB = b[2]
popularityDistance = abs(popularityA - popularityB)
return genreDistance + popularityDistance # Всё кажется правильным на данный момент. Но проблема, похоже, заключается в следующей строке кода.
print(ComputeDistance(movieDict[2], movieDict[4]))
Примечание: Этот код можно найти здесь: https://hendra-herviawan.github.io/Movie-Recommendation-based-on-KNN-K-Nearest-Neighbors.html
Примечание: Этот код также можно найти на стр. 245-250, гл. 7, Hands-On Data Science and Python Machine Learning Фрэнка Кейна. У меня есть электронная версия, и я могу отправить её по запросу.
Примечание: Я не знаю, как поделиться csv-файлами здесь. Я буду признателен, если кто-то подскажет, как я могу это сделать.
Я думаю, я наткнулся на рабочий вариант. Я публикую правильный код, так как кому-то это может понадобиться когда-нибудь:
import numpy as np
import pandas as pd
r_cols = ['user_id', 'movie_id', 'rating']
ratings = pd.read_csv('C:/Users/dell/Downloads/DataScience/DataScience-Python3/ml-100k/u.data', sep='\t', engine="python", names=r_cols, usecols=range(3)) # пожалуйста, укажите путь к файлу здесь. Файл u.data
print(ratings.head())
movieProperties = ratings.groupby('movie_id').agg({'rating': [np.size, np.mean]})
print(movieProperties.head())
movieNumRatings = pd.DataFrame(movieProperties['rating']['size'])
movieNormalizedNumRatings = movieNumRatings.apply(lambda x: (x - np.min(x)) / (np.max(x) - np.min(x)))
print(movieNormalizedNumRatings.head())
movieDict = {}
with open('C:/Users/dell/Downloads/DataScience/DataScience-Python3/ml-100k/u.item') as f: # Файл u.item
temp = ''
for line in f:
fields = line.rstrip('\n').split('|')
movieID = int(fields[0])
name = fields[1]
genres = fields[5:25]
genres = map(int, genres)
movieDict[movieID] = (name, genres, movieNormalizedNumRatings.loc[movieID].get('size'), movieProperties.loc[movieID].rating.get('mean'))
print(movieDict[1])
from scipy import spatial
def ComputeDistance(a, b):
genresA = np.array(list(a[1]))
genresB = np.array(list(b[1]))
genreDistance = spatial.distance.cosine(genresA, genresB)
popularityA = np.array(a[2])
popularityB = np.array(b[2])
popularityDistance = abs(popularityA - popularityB)
return genreDistance + popularityDistance
print(ComputeDistance(movieDict[2], movieDict[4]))
Я использую эту возможность, чтобы поблагодарить тех, кто дал мне один или два совета.
Ответ или решение
Понимание сообщения об ошибке в коде с использованием KNN для классификации фильмов
Когда вы работаете с методами машинного обучения, такими как KNN (K-ближайших соседей), важно иметь правильное понимание используемых данных и алгоритмов. Обращение к ошибкам, возникающим при программировании, является важной частью обучения. В данной статье мы разоберем код, связанный с классификацией фильмов, обнаруженные ошибки и их решения.
Описание проблемы
Ваш код предназначен для классификации фильмов на основе их жанров с использованием метода KNN. Основные этапы, которые вы выполняете, включают:
- Загрузка данных о рейтингах фильмов.
- Обработка этих данных для получения статистики по каждому фильму.
- Создание словаря
movieDict
, который хранит информацию о каждом фильме, включая его жанры и популярность. - Расчет расстояния между фильмами на основе жанров и популярности с помощью функции
ComputeDistance
.
Выявленная ошибка
Как вы и указали, ошибка возникает при выполнении функции ComputeDistance
, которая выглядит следующим образом:
def ComputeDistance(a, b):
genresA = a[1]
genresB = b[1]
genreDistance = spatial.distance.cosine(genresA, genresB)
popularityA = a[2]
popularityB = a[2]
popularityDistance = abs(popularityA - popularityB)
return genreDistance + popularityDistance
Ошибка, скорее всего, возникает из-за попытки передачи объектов, которые не могут быть обработаны функцией spatial.distance.cosine
. В частности, значениями genresA
и genresB
являются списки жанров, которые необходимо конвертировать в массивы NumPy.
Исправление ошибки
Изменяя код следующим образом, вы можете избежать ошибок:
- Преобразование жанров из объектов
map
в массивы NumPy. Это гарантирует, что объекты могут быть корректно обработаны при вычислении расстояния. - Корректное получение значения популярности для второго фильма (вы имели ошибку, где два раза обращались к
a[2]
, вместоb[2]
во втором вызове).
Обновленный код:
from scipy import spatial
def ComputeDistance(a, b):
genresA = np.array(list(a[1]))
genresB = np.array(list(b[1]))
genreDistance = spatial.distance.cosine(genresA, genresB)
popularityA = a[2]
popularityB = b[2]
popularityDistance = abs(popularityA - popularityB)
return genreDistance + popularityDistance
Рекомендации по улучшению
- Документация кода: Добавьте комментарии и документируйте ваши функции, чтобы повысить читаемость кода.
- Отладка: Используйте отладочные операторы, такие как
print()
, для проверки значений переменных на отдельных этапах выполнения кода. - Обработка исключений: Включите конструкцию
try-except
для обработки потенциальных ошибок, связанных с чтением файлов или преобразованием данных.
Заключение
Работа с KNN методом в машинном обучении — это увлекательное и сложное занятие. Правильное понимание кода и выявление ошибок — ключ к успеху в вашем обучении. Актуализировав ваш код, вы не только устранили ошибку, но и улучшили его функциональность и читаемость. Удачи в вашем дальнейшем обучении в области науки о данных и машинного обучения!