Все с нетерпением ждут этих событий 4 года. Правильно, я говорю об Олимпийских играх. Здесь я буду писать о наборах данных, связанных с Олимпийскими играми, которые я нашел на Kaggle от Randi H Griffin.

«Так ты хочешь побеждать на Олимпийских играх, друг мой? И я тоже ... Но сначала отметьте условия и последствия. Вам придется подчинить себя дисциплине; есть по правилам, избегать пирожных и сладостей; заниматься спортом в назначенный час, нравится вам это или нет, и в холод, и в жару; воздерживаться от холодных напитков и вина по своему желанию. Затем, в самом конфликте, вы, скорее всего, вывихнете запястье или вывернете лодыжку, проглотите много пыли, вас жестоко избьют и, после всего этого, вы потерпите поражение ».

- Эпиктет (Рассуждения с энхиридионом и фрагментами)

Данные

В наборе данных 15 атрибутов с 271 тыс. Выборок, что является самым большим набором данных, который я буду изучать на Medium. Я буду копать золото в качестве основной цели этого исследования с предоставлением информации о том, выигрывают ли спортсмены медаль или нет.

Attributes:
ID    -> Each athlete's unique number 
Name  -> 134732 Unique Values
Sex 
Age
Height 
Weight
Team
NOC    -> National Olympic Committee
Games  -> Year and season
Year   -> 1896 - 2016
Season -> Summer or Winter
City
Sport
Event
Medal  -> Gold, Silver, Bronze, or NA

Поскольку в наборе данных 271 тыс. Строк, лучше проверить недостающие значения.

print(df.isnull().sum())

Здесь видно, что; В столбцах «Возраст», «Рост» и «Вес» отсутствуют значения. Эти столбцы имеют огромное значение для получения точных результатов. Таким образом, столбцы нельзя удалить как столбец, их нужно заменить.

Предварительная обработка

Во-первых, данные взяты в структуре DataFrame панд;

import pandas as pd

olympics_csv = pd.read_csv('athlete_events.csv')

df = pd.DataFrame(olympics_csv)

Для замены отсутствующих значений необходимо соответствующим образом заполнить поля «Возраст», «Вес» и «Рост». Кроме того, необходимо пронумеровать многие столбцы: Имя, Пол, Команда, НОК, Игры, Сезон, Город, Спорт и Событие.

Значения медалей, пронумерованные функциями библиотеки pandas;

df['Medal']  = df.groupby(['Medal']).ngroup()

Если спортсмен побеждает:

  • Золото - ›1
  • Серебро - ›2
  • Бронза - ›3
  • Проигрыши - ›-1

Вес, возраст и рост заменены средним значением каждого столбца;

df['Weight'] = df['Weight'].fillna(df['Weight'].mean().astype(int))

df['Height'] = df['Height'].fillna(df['Height'].mean().astype(int))
df['Age'] = df['Age'].fillna(df['Age'].mean().astype(int))

Для других столбцов;

df['Name']   = df.groupby(['Name']).ngroup()
df['Sex']    = df.groupby(['Sex']).ngroup()
df['Team']   = df.groupby(['Team']).ngroup()
df['NOC']    = df.groupby(['NOC']).ngroup()
df['Games']  = df.groupby(['Games']).ngroup()
df['Season'] = df.groupby(['Season']).ngroup()
df['City']   = df.groupby(['City']).ngroup()
df['Sport']  = df.groupby(['Sport']).ngroup()
df['Event']  = df.groupby(['Event']).ngroup()

После операций заполняются и нумеруются все столбцы, кроме столбца Возраст;

Наконец, обучающие значения были разделены на две части для последующего моделирования;

X = np.array(df.iloc[:,0:-1])
Y = np.array([[df['Medal']]])

Y нужно было изменить;

Y = Y.reshape(271116)

Создание модели классификатора SGD

X_train, X_test, y_train, y_test = train_test_split(X,Y, test_size=0.2, random_state = 5)

clf = linear_model.SGDClassifier()
clf.fit(X, Y)

y_pred = clf.predict(X_test)
print("Accuracy score of SGD: ",accuracy_score(y_test,y_pred))

Создание наивной байесовской модели

model = GaussianNB()
model.fit(X_train, y_train)

y_pred = model.predict(X_test)
print("Accuracy score of Naive Bayes:",accuracy_score(y_test,y_pred))

Создание модели аппроксимации ядра

Эта модель рекомендована схемой моделей sci-kit, так почему бы не попробовать. Просто шучу.

В машинном обучении методы ядра - это класс алгоритмов анализа паттернов, наиболее известным элементом которого является машина опорных векторов (SVM). Общая задача анализа паттернов - найти и изучить общие типы отношений в наборах данных.

-Википедия говорит о методах ядра

Это объяснение совпадает с целью. Ожидается, что алгоритм машинного обучения найдет закономерности.

rbf_feature = RBFSampler(gamma=1, random_state=1)
X_features = rbf_feature.fit_transform(X)
clf = SGDClassifier()
clf.fit(X_features, Y)

print("Accuracy score of Kernel Approximation:",clf.score(X_features, Y))

Заключение и результаты

Во-первых, результаты;

Accuracy score of SGD: 0.84731853054
Accuracy score of Naive Bayes: 0.854012983181
Accuracy score of Kernel Approximation: 0.853262072323

В этом наборе данных уровни точности оказались ниже ожидаемых для всех трех моделей, и есть один важный момент для этого результата;

  • Заполнение пропущенных значений средними значениями

Всего было заполнено 132,520 значений, и это колоссальное количество показало свое влияние на алгоритм.

Я вернусь, чтобы повысить точность.

Наконец, мой репозиторий GitHub можно найти здесь.