Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 9, 2018 04:31:11

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10003
Репутация: +  857  -
Профиль   Отправить e-mail  

Ошибка при создании цикла.

Belg
Теперь говорит:
C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\indexing.py:858: FutureWarning:
Passing list-likes to .loc or with any missing label will raise
KeyError in the future, you can use .reindex() as an alternative.
Это всё проблемы pandas, к питону это не относится. Они там что-то планируют переделывать и вот сразу пишут, что будут переделывать. Очень на винду смахивает: вместо того, чтобы делать свои дела, ты сидишь и занимаешься проблемами самой системы.

Belg
Если нужно описание задачи, то вот кратко:
Есть данные на 50 тысяч боёв в доте 2, надо научить модель определять победителя.
Ну и как ты определяешь? Просто не видно, в чём необходимость использования pandas. Всё это можно делать на голом питоне, который сделан гораздо логичнее, чем модуль какой-то там.



Офлайн

#2 Апрель 10, 2018 01:19:34

Belg
Зарегистрирован: 2018-03-21
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

Ошибка при создании цикла.

scidam
Хорошо, вот рабочий пример. Проверяем есть ли в колонке ‘r1_hero_roles’ подстрока ‘sd’,если есть, то увеличиваем соответствующее значение в колонке ‘radiant_Nukers’. Без циклов.
А возможно это реализовать ещё и с помощью цикла? Что б брать ячейку x и в конце цикла i увеличивать на один? И что б значение увеличивалось тоже в “итой” ячейке, а то весь столбец заполняется количеством вообще всех ‘radiant_Nukers’ в таблице, а должно: если есть в строчке 1 или 2 таких ячейки, то в этой же строчке и меняется значение, не воздействуя на остальные.

Офлайн

#3 Апрель 10, 2018 01:47:02

scidam
Зарегистрирован: 2016-06-15
Сообщения: 288
Репутация: +  35  -
Профиль   Отправить e-mail  

Ошибка при создании цикла.

Belg
А возможно это реализовать ещё и с помощью цикла?
Циклы в Python медленные. Поскольку у вас 50k записей, то цикл по всем записям будет считаться достаточно долго.
Используя векторные вычисления с pandas все должно быть гораздо быстрее. С pandas можно формулировать досточно сложные условия на значения элементов в столбцах, лучше подробно изучить документацию по pandas. Я до конца задачу не пойму, но очень вероятно ее можно решить с помощью аппарата векторных операций в Pandas (или Numpy).


Офлайн

#4 Апрель 10, 2018 02:24:35

Belg
Зарегистрирован: 2018-03-21
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

Ошибка при создании цикла.

scidam
Могу объяснить задачу подробнее. Есть данные на бой в доте 2, в нём как известно участвуют 5 на 5 игроков. По кучке данных необходимо предсказать победу той или иной команды. Мне пришла идея подсчитать количество героев каждой роли (те самые Nukers и другие) в обоих командах (radiant и dire). Строка - это 1 бой, их 50 тысяч, на основе их будет обучаться модель. Есть столбец roles, где через запятую указаны “роли” каждого героя. На их основе надо посчитать общее количество героев в команде, которые могут исполнять ту или иную роль. Вооот. Так же есть практически такая же задача с типом атаки, и ещё одна, но эта задача, мне кажется, для отдельной темы. Вот такие пироги.

Вот так это выглядит:

Проблема ещё и в том, что дедлайн через 45 часов, с питоном я знаком на довольно слабом уровне (об векторных операциях ещё не слышал), а помимо технического написания кода надо ещё и придумать, что собственно писать, так что если можно как-то попроще - то отлично. А время - не важно, пусть посчитает комп, к тому же, цикл, который хоть работал не так, как надо мне, но всё же прошёлся по всему доку где-то за минуту всего лишь.

Отредактировано Belg (Апрель 10, 2018 02:28:08)

Прикреплённый файлы:
attachment t1.png (149,0 KБ)

Офлайн

#5 Апрель 10, 2018 04:12:17

scidam
Зарегистрирован: 2016-06-15
Сообщения: 288
Репутация: +  35  -
Профиль   Отправить e-mail  

Ошибка при создании цикла.

Ваша задача может быть сформулирована как задача классификации; чтобы построить классификатор, решающий
задачу, рекомендуется использовать готовые для этого решения, например, библиотеку scikit-learn.
Конечно, можно создать “экспертный” классификатор на чистом Python, без всяких там sklearn, например,
использовать решающее правило “если в команде больше героев, то та и победит”. Однако, может оказать так, что подобные экспертные классификаторы могут обаладать слабой прогностической силой.

Я представляю себе задачу следующим образом. Для начала нам нужно подготовить данные, чтобы их можно
было передать на обучение одному из алгоритмов классификации из sklearn. При этом нам лучше будет использовать
какой-нибудь классификатор, который принимает как количественные, так и качественные признаки. Хорошим выбором в этом случае будут деревья решений или случайный лес (RandomForestClassifier).

Самое главное теперь подготовить данные. У нас есть две команды: radiant, dire. и результат боя – допустим это
переменная Y. Эта переменная может принимать 2 значения: 0 – победила команда dire, 1 – победила команда radiant;
если возможна ничья, то тогда у переменной Y должно будет 3 значения: 2 – дополнительно соответствует ничье.
Таким образом, у нас должен быть сформирован массив Y из 0 и 1 (или 0, 1, 2 – если допустимы ничьи) – общей длиной 50k. Используя pandas это должно быть просто.

Теперь собственно данные X, которые вместе с Y, должны будут переданы на обучение классификатору.

C матрицей данных, или значениями переменных предикторов более сложно. Здесь мы сами должны создать такие предикторы (по ML терминологии этот этап обычно называется feature engeneering), или отобрать, если они уже созданы.
Здесь должны быть переменные, характеризующие как первую, так и вторую команду, какая-то такая матрица:

 'num_of_heroes1 '  'total_health1 ' ...,  'num_of_heroes2 '  'total_health2 ' ....
3                                420                         2                             510
....etc.
50 k rows

Потом, эту матрицу X, вместе с Y, передаем классификатору, как-то так:

 clf = RandomForestClassfiier()
clf.fit(X, Y)

Далее, вообще говоря, может возникнуть проблема оценки качестве классификации, подбора параметров классификатора, обеспечивающего приемлемую точность. Для оценки точности обычно разделяют имеющуюся обучающую выборку на тестовую и тренировочную. На тестовой проверяют работу классификатора. В sklearn многое
автоматизировано в этом плане и оценить точность классификатора можно, например, используя cross_val_score функцию.

Далее, чтобы предсказать результат боя на новых данных, нужно вызвать:

 clf.predict(NEW_DATA)

где NEW_DATA – имеет то же число колонок, что и X.
На выходе получаем либо 0 либо 1, т.е. какая команда выиграет по прогнозу (либо еще и 2, если допустимы ничьи).

В общих словах, какой-то такой процесс классификации …

























Офлайн

#6 Апрель 10, 2018 13:55:58

Belg
Зарегистрирован: 2018-03-21
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

Ошибка при создании цикла.

scidam
Ваша задача может быть сформулирована как задача классификации; чтобы построить классификатор, решающийзадачу, рекомендуется использовать готовые для этого решения, например, библиотеку scikit-learn. Конечно, можно создать “экспертный” классификатор на чистом Python, без всяких там sklearn, например, использовать решающее правило “если в команде больше героев, то та и победит”. Однако, может оказать так, что подобные экспертные классификаторы могут обаладать слабой прогностической силой.Я представляю себе задачу следующим образом. Для начала нам нужно подготовить данные, чтобы их можно было передать на обучение одному из алгоритмов классификации из sklearn. При этом нам лучше будет использоватькакой-нибудь классификатор, который принимает как количественные, так и качественные признаки. Хорошим выбором в этом случае будут деревья решений или случайный лес (RandomForestClassifier).Самое главное теперь подготовить данные. У нас есть две команды: radiant, dire. и результат боя – допустим этопеременная Y. Эта переменная может принимать 2 значения: 0 – победила команда dire, 1 – победила команда radiant;если возможна ничья, то тогда у переменной Y должно будет 3 значения: 2 – дополнительно соответствует ничье.Таким образом, у нас должен быть сформирован массив Y из 0 и 1 (или 0, 1, 2 – если допустимы ничьи) – общей длиной 50k. Используя pandas это должно быть просто. Теперь собственно данные X, которые вместе с Y, должны будут переданы на обучение классификатору. C матрицей данных, или значениями переменных предикторов более сложно. Здесь мы сами должны создать такие предикторы (по ML терминологии этот этап обычно называется feature engeneering), или отобрать, если они уже созданы. Здесь должны быть переменные, характеризующие как первую, так и вторую команду, какая-то такая матрица:

Спасибо за разъяснения, но с этим я уже давно работаю) Проблема была только в создании нового признака, нового столбца в таблице, с помощью цикла.
В данный момент единственное, что меня интересует, как реализовать цикл, где будет браться “ИТАЯ” ячейка (по номеру строки), анализироваться и к другой тоже итой ячейке будут применяться изменения.

Отредактировано Belg (Апрель 10, 2018 14:01:45)

Офлайн

#7 Апрель 10, 2018 14:25:59

Belg
Зарегистрирован: 2018-03-21
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

Ошибка при создании цикла.

scidam
Ваша задача может быть сформулирована как задача классификации; чтобы построить классификатор, решающийзадачу, рекомендуется использовать готовые для этого решения, например, библиотеку scikit-learn. Конечно, можно создать “экспертный” классификатор на чистом Python, без всяких там sklearn, например, использовать решающее правило “если в команде больше героев, то та и победит”. Однако, может оказать так, что подобные экспертные классификаторы могут обаладать слабой прогностической силой.Я представляю себе задачу следующим образом. Для начала нам нужно подготовить данные, чтобы их можно было передать на обучение одному из алгоритмов классификации из sklearn. При этом нам лучше будет использоватькакой-нибудь классификатор, который принимает как количественные, так и качественные признаки. Хорошим выбором в этом случае будут деревья решений или случайный лес (RandomForestClassifier).Самое главное теперь подготовить данные. У нас есть две команды: radiant, dire. и результат боя – допустим этопеременная Y. Эта переменная может принимать 2 значения: 0 – победила команда dire, 1 – победила команда radiant;если возможна ничья, то тогда у переменной Y должно будет 3 значения: 2 – дополнительно соответствует ничье.Таким образом, у нас должен быть сформирован массив Y из 0 и 1 (или 0, 1, 2 – если допустимы ничьи) – общей длиной 50k. Используя pandas это должно быть просто. Теперь собственно данные X, которые вместе с Y, должны будут переданы на обучение классификатору. C матрицей данных, или значениями переменных предикторов более сложно. Здесь мы сами должны создать такие предикторы (по ML терминологии этот этап обычно называется feature engeneering), или отобрать, если они уже созданы. Здесь должны быть переменные, характеризующие как первую, так и вторую команду, какая-то такая матрица:

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

 for lines in x['r1_attack_type']:
    i= x['r1_attack_type'][lines]
    if i =='Melee':
        x['radiant_melee'][lines] +=1
    else:
        x['radiant_ranged'][lines] +=1

Говорит, TypeError: an integer is required. Тут надо сказать, что dtype: object. Думаю брать str:

 for lines in x['r1_attack_type']:
    i= str(x['r1_attack_type'][lines])
    if i =='Melee':
        x['radiant_melee'][lines] +=1
    else:
        x['radiant_ranged'][lines] +=1

Ему пофиг, тоже самое(

Офлайн

#8 Апрель 11, 2018 05:12:59

scidam
Зарегистрирован: 2016-06-15
Сообщения: 288
Репутация: +  35  -
Профиль   Отправить e-mail  

Ошибка при создании цикла.

Пусть x это dataframe с колонками r1_attack_type, radiant_melee, radiant_ranged;
при этом r1_attack_type имеет dtype=np.object;
тогда фрагмент

  for lines in x['r1_attack_type']:
    i= x['r1_attack_type'][lines]
    if i =='Melee':
        x['radiant_melee'][lines] +=1
    else:
        x['radiant_ranged'][lines] +=1

можно переписать как-то так:

 x.loc[x['r1_attack_type'] == 'Melee', 'radiant_melee'] += 1
x.loc[x['r1_attack_type'] != 'Melee', 'radiant_ranged'] += 1
Т.е. мы выбираем те строки, у которых в колонке r1_attack_type == Melee и увеличиваем соответствующее значение
radiant_melee на 1; и во второй строке кода выбираем те строки у которых в колонке r1_attack_type не равно Melee,
и увеличиваем соответствующее значение radiant_ranged.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version