В своей рабочей папке открыть командное окно и запустить jupyter командой
> jupyter notebook
Создать новый блокнот: [New] -> [Python 3].
В новом блокноте загрузить пару необходимых библиотек:
In [13]:
import numpy as np
import pandas as pd
In [14]:
shanghai_rank = pd.read_csv('datasets/shanghaiData.csv')
shanghai_rank = shanghai_rank[shanghai_rank['year'] == 2015]
shanghai_rank.head()
Out[14]:
Заполним отсутствующие значения числом 0.
In [15]:
shanghai_rank.fillna(0.0, inplace=True)
Целью задачи регрессии в данном случае — предсказать значение колонки total_score на основании других числовых колонок, за исключением world_rank и year.
Разобьем всё множество данных на тестовое и обучающее. Отведём на тестовое множество 25% всех данных.
In [16]:
SEED = 42
from sklearn.model_selection import train_test_split
train, test = train_test_split(shanghai_rank, test_size=0.25, random_state=SEED)
Выберем колонки, которые будут использованы для решения задачи регрессии и создадим массивы, которые будут использованы для обучения.
In [17]:
cols = ['alumni', 'award', 'hici', 'ns', 'pub', 'pcp']
train_data = np.array(train[cols])
test_data = np.array(test[cols])
train_target = np.array(train['total_score'])
test_target = np.array(test['total_score'])
Построим зависимость total_score от каждого из выбранных столбцов.
In [18]:
%matplotlib inline
import matplotlib.pyplot as plt
plt.figure(figsize=(16, 8))
for i, col in enumerate(cols):
plt.subplot(2, 3, i+1)
plt.scatter(shanghai_rank[col], shanghai_rank['total_score'])
plt.xlabel(col)
plt.ylabel('total_score')
В качестве примера для решения задачи регрессии выберем просетйший метод — метод линейной регрессии
In [19]:
from sklearn.linear_model import LinearRegression
lr = LinearRegression()
Обучим модель на множестве обучающих данных.
In [20]:
lr.fit(train_data, train_target)
Out[20]:
Проверим качество регрессии на тестовом множестве.
In [21]:
prediction = lr.predict(test_data)
Среднеквадратическое отклонение предсказанного значения от реального:
In [22]:
from sklearn.metrics import mean_squared_error
dist = mean_squared_error(test_target, prediction)
print(dist)
Графически можно сравнить предсказания и реальные значения так:
In [23]:
x, y = zip(*sorted(zip(prediction, test_target)))
plt.plot(x, y)
plt.hold(True)
plt.plot([0, 100], [0, 100], '--r')
plt.xlabel('Prediction')
plt.ylabel('Real values')
Out[23]:
В идеале все значения лежали бы на прямой $y=x$.
Ваша задача — незначительно улучшить результат. Баллы за лабораторную работу будут вычисляться как
$$M = \left\lceil{\min\left(100 \left(38.57421 - \frac{1}{N}\sum_{i=1}^{N}(y_i - \hat{y}_i)^2\right), 10 \right)}\right\rceil$$
In [28]:
print("Количество баллов = {}".format(np.min([100 * (38.57421 - dist), 10])))
Для этого можно использовать любые методы из библиотеки sklearn. Переменную SEED менять нельзя.