@D_K_D
Junior

Не работает модель для игры камень, ножницы, бумага?

Делаю модель для игры камень, ножницы, бумага. Модель готова, но она не точна и не может работать с ничьёй.
Как сделать модель более поточнее и научить её определять ничью. Если добавлять в тестовые значения ничью, то она совсем не работает.
import pandas as pd

df = pd.read_csv("test.csv")

def fill(row):
    if row == 'stone':
        return 1
    elif row == 'shears':
        return 2
    elif row == 'paper':
        return 3

df['player1'] = df['player1'].apply(fill)
df['player2'] = df['player2'].apply(fill)

from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier

x = df.drop("result", axis=1) 
y = df['result'] 

sc = StandardScaler() 

x_train = sc.fit_transform(x) 

classifier = KNeighborsClassifier(n_neighbors=2) 
classifier.fit(x_train, y) 

mf = pd.read_csv("./train.csv")
mf['player1'] = mf['player1'].apply(fill)
mf['player2'] = mf['player2'].apply(fill)

result = classifier.predict(mf.values)

nf = pd.read_csv("./train.csv")

df = pd.DataFrame({
    'player1':nf['player1'],
    'player2':nf['player2'],
    'result':result
})

df.to_csv('data.csv', index=False)

Данные для тренировки test.csv

player1,player2,result
stone,shears,1
stone,paper,2
shears,stone,2
shears,paper,1
paper,stone,1
paper,shears,2
stone,shears,1
stone,paper,2
stone,stone,0
paper,paper,0
shears,shears,0

Данные для проверки train.csv

player1,player2
stone,shears
stone,paper
shears,stone
shears,paper
paper,stone
stone,shears
stone,paper
shears,stone
shears,paper
paper,stone
stone,stone
paper,paper
shears,shears
  • Вопрос задан
  • 85 просмотров
Решения вопроса 1
Maksim_64
@Maksim_64
Data Analyst
Вся твоя затея не имеет никакого смысла. KNeighborsClassifier - использует по умолчанию Minkowski metric, что эквивалетно для p=2, обычной Евклидовой дистанции.

Евклидова дистанция не имеет никакого смысла - для категориальных переменных на вход, она мощный инструмент для непрерывных и бесполезный для категориальных. А у тебя именно категории stone, shears и paper которые закодировал ты правда, совершенно не правильно. Тебе тут нужен OneHotEncoder, а так ты как бы говоришь алгоритму что paper (3) чем то отличается по весу в модели чем stone (1) . В целом можно работать с так называемой Hamming distance, которая позволяет KNeighborsClassifier получать категории на вход, но scikit-learn не поддерживает ее из коробки, то есть ее можно добавить как custom metric.

Если ты собираешься чему то научится то:
1. Изучи примеры с объектом pipeline он позволяется осуществлять трансформации на тестовом и тренировачном датасете, внутри пайплайна.

2. Для любого алгоритма для этой задачи необходим OneHotEncoder его прям в пайплайн встроешь. Примеры в доках scikit-learn имеются.

3. По скольку у тебя категориальные переменные на вход, то используй алгоритмы которые базируются на деревьях решений. Все они есть в scikit-learn.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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