import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from random import randint
import seaborn
%pylab inline
Чтобы обучать алгоритмы, нужно иметь данные. Посмотрим, как можно считать данные. Допустим, данные хранятся в формате csv. Тогда считать их можно следующим образом:
X_train = pd.read_csv("X_train.csv", header=0)
Параметр header указывает, какую из стро считать, как имена столбцов. Если имён нет, то header=None
Можно просмотреть маленькую часть таблицы:
X_train.head()
Его тип:
print type(X_train)
y_train = pd.read_csv("y_train.csv", header=0)
y_train.head()
Заметим, что данные X_train --- это двумерный список (двумерный массив, матрица). Для удобной работы с матрицами есть модуль numpy. Вот так данные переводятся в формат numpy.array:
X_train = np.array(X_train)
print type(X_train)
print X_train.shape # узнать форму объекта
y_train = np.array(y_train)
print y_train.shape
Немного о numpy, а именно, что можно делать с типом np.array:
Складывать, вычитать, умножать, делить, возводить в степень, а именно, это все делается почленно:
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
print(a + b)
print(a - b)
print(a * b)
print(a / b) # целочисленное деление
print(a * 1.0 / b) # вещественное деление
print(a ** b)
Точно так же это работает и с двумерными и вообще любыми np.array любой формы (главное, чтобы форма была одинаковой):
a = np.array([[1, 2, 3], [0, 1, 0]])
b = np.array([[4, 5, 6], [3, 1, 2]])
print a
print b
print a + b
print a - b
print a * b
print a / b # целочисленное деление
print a * 1.0 / b # вещественное деление
print a ** b
a = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
print(a)
Можно также менять форму. Главное, чтобы произведение измерений было одинаково (иными словами, кол-во элементов постоянно):
a = np.array([[1, 2, 4], [5, 6, 7]])
print a.shape
print a
a = a.reshape((3, 2)) # 3 строки, 2 столбца
print a.shape
print a
Выпрямить можно двумя способами:
a = np.array([[1, 2, 4], [5, 6, 7]])
print a.reshape((1, -1)) # означает, сделать одну строчку, а столбцов столько, сколкьо осталось
print a.reshape((-1,)) # все развернуть в одну строку
print a.ravel()
print a.ravel().shape
Можно индексироваться, причем не совсем привычным способом:
a = np.array([3, 4, 5, 6]) # для одномерных массивов все привычным способом
print a.shape
print a[0]
print a[1:4]
print a[2:]
a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print a.shape
print a[0] # вывести нулевую строчку
print a[0][0] # вывести элемент [0][0]
# но правильнее писать так:
print a[0, 0] # сколько измерений - 1 = столько запятых
print a[:, :] # вывести все
print a[:, 0] # вывести нулевой столбец. иными словами, взять все строчки и пересечь с нулевым столбцом
print a[:2, :2] # вывести верхний угол размера 2 на 2
print a[0, :] # = print a[0]
Теперь перейдем к рисованию графиков:
plt.figure() # cоздает поле. можно задачть размер в параметрах: figsize=(3, 4)
plt.plot([0, 1, 2, 3, 4, 5, 6, 3], [0, 8, 1, 5, 3, 7, 2, 3])
plt.show()
plot дорисовывает линии графика сам
Можно также задавать свои параметры (более подробную информацию можно найти с помощью help(plt.plot)):
plt.figure(figsize=(30, 10))
Lx = [2, 3, 4, 5, 6, 7, 8, 9, 10]
Ly = [0, 2, 4, 6, 8, 6, 4, 2, 0]
Kx = [14, 14, 14, 15, 16, 17, 18, 17, 16, 15, 14, 15, 16, 17, 18, 17, 16, 15, 14, 14, 14]
Ky = [0, 2, 4, 3, 2, 1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 7, 6, 5, 4, 6, 8]
Shx = [22] * 9 + [23, 24, 25] + [26] * 9 + [27, 28, 29] + [30] * 9
Shy = [0, 2, 4, 6, 8, 6, 4, 2, 0] + [0] * 3 + [0, 2, 4, 6, 8, 6, 4, 2, 0] + [0] * 3 + [0, 2, 4, 6, 8, 6, 4, 2, 0]
plt.plot(Lx, Ly, color="r", linestyle="--", linewidth=2,
marker="*", markerfacecolor="b", markersize=12, label="graph 1")
plt.plot(Kx, Ky, color="r", linestyle="--", linewidth=2,
marker="*", markerfacecolor="b", markersize=12, label="graph 2")
plt.plot(Shx, Shy, color="r", linestyle="--", linewidth=2,
marker="*", markerfacecolor="b", markersize=12, label="graph 3")
plt.xlim(0, 50)
plt.ylim(-2, 10)
plt.legend()
plt.show()
scatter рисует наборы точек, умеет их раскрашивать в разные цвета, менять размеры:
x = np.array([1, 7, 3, 9, 3, 9, 2, 5, 2, 7, 3, 9, 3])
y = np.array([5, 8, 2, 9, 2, 0, 1, 7, 2, 8, 2, 8, 3])
plt.figure()
plt.scatter(x, y)
plt.show()
x = np.array([1, 7, 3, 9, 3, 9, 2, 5, 2, 7, 3, 9, 3])
y = np.array([5, 8, 2, 9, 2, 0, 1, 7, 2, 8, 2, 8, 3])
plt.figure()
plt.scatter(x, y, s=100, c="r", marker="^", alpha=0.7)
plt.show()
x = np.array([randint(0, 100) for i in xrange(200)])
y = np.array([randint(0, 100) for i in xrange(200)])
sizes = x ** 2 + y ** 2
cm = plt.get_cmap('jet')
colors = map(lambda c: cm(1.0 * c / max(sizes)), sizes)
plt.figure(figsize=(10, 10))
plt.scatter(x, y, s=sizes, c=colors, marker="o", alpha=0.7)
sizes = np.sqrt(sizes)
cm = plt.get_cmap('cubehelix')
colors = map(lambda c: cm(1 - 1.0 * c / max(sizes)), sizes)
plt.scatter(x, y, s=sizes, c=colors, marker="o", alpha=0.7)
x = np.array([randint(0, 100) for i in xrange(200)])
y = np.array([randint(0, 100) for i in xrange(200)])
sizes = x ** 2 + y ** 2
cm = plt.get_cmap('gist_earth')
colors = map(lambda c: cm(1.0 * c / max(sizes)), sizes)
plt.figure(figsize=(10, 10))
plt.scatter(x, y, s=sizes, c=colors, marker="*", alpha=0.7)
sizes = 3 * np.sqrt(sizes)
cm = plt.get_cmap('cubehelix')
colors = map(lambda c: cm(1 - 1.0 * c / max(sizes)), sizes)
plt.scatter(x, y, s=sizes, c=colors, marker="*", alpha=0.7)
Так можно строить bar plot:
x = [1, 2, 3, 4, 5]
y = [5, 1, 7, 4, 2]
plt.figure(figsize=(12, 5))
plt.bar(x, y, width=0.5, color=["r", "g", "b", "y", "m"], alpha=0.6,
tick_label=["red", "green", "blue", "yellow", "magenta"], align="center")
plt.xlim(0, 7) # задать пределы по координате x
plt.ylim(0, 10) # задать пределы по координате y
Теперь изобразим, как же выглядят те данные, которые мы считали в начале. У них две фичи, поэтому их можно изобразить на плоскости:
plt.figure(figsize=(10, 10))
plt.scatter(X_train[:, 0], X_train[:, 1])
Посмотрим, сколько классов в y_train:
np.unique(y_train, return_counts=True)
Теперь раскрасим данные в соответвии с классами:
colors = ["r" if y == -1 else "g" for y in y_train]
plt.figure(figsize=(10, 10))
plt.scatter(X_train[:, 0], X_train[:, 1], color=colors)
X_test = pd.read_csv("X_test.csv", header=0)
X_test = np.array(X_test)
Теперь визуализируем тестовые данные:
plt.figure(figsize=(10, 10))
plt.scatter(X_test[:, 0], X_test[:, 1])
Предскажем цвет:
colors = ["r" if x[0] < 0 else "g" for x in X_test]
plt.figure(figsize=(10, 10))
plt.scatter(X_test[:, 0], X_test[:, 1], color=colors)