Все с нетерпением ждут этих событий 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 можно найти здесь.