Понимание этого сообщения об ошибке

Вопрос или проблема

Я использую книгу и видео, чтобы научиться использовать метод 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. Основные этапы, которые вы выполняете, включают:

  1. Загрузка данных о рейтингах фильмов.
  2. Обработка этих данных для получения статистики по каждому фильму.
  3. Создание словаря movieDict, который хранит информацию о каждом фильме, включая его жанры и популярность.
  4. Расчет расстояния между фильмами на основе жанров и популярности с помощью функции 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.

Исправление ошибки

Изменяя код следующим образом, вы можете избежать ошибок:

  1. Преобразование жанров из объектов map в массивы NumPy. Это гарантирует, что объекты могут быть корректно обработаны при вычислении расстояния.
  2. Корректное получение значения популярности для второго фильма (вы имели ошибку, где два раза обращались к 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 методом в машинном обучении — это увлекательное и сложное занятие. Правильное понимание кода и выявление ошибок — ключ к успеху в вашем обучении. Актуализировав ваш код, вы не только устранили ошибку, но и улучшили его функциональность и читаемость. Удачи в вашем дальнейшем обучении в области науки о данных и машинного обучения!

Оцените материал
Добавить комментарий

Капча загружается...