Обзор библиотек для машинного обучения на Python — различия между версиями
(→Перцептрон) |
(→Сверточная нейронная сеть) |
||
Строка 198: | Строка 198: | ||
Реализация сверточной нейронной сети для классификации текста: | Реализация сверточной нейронной сети для классификации текста: | ||
− | from __future__ import print_function | + | '''from''' __future__ '''import''' print_function |
− | from keras.preprocessing import sequence | + | '''from''' keras.preprocessing '''import''' sequence |
− | from keras.models import Sequential | + | '''from''' keras.models '''import''' Sequential |
− | from keras.layers import Dense, Dropout, Activation | + | '''from''' keras.layers '''import''' Dense, Dropout, Activation |
− | from keras.layers import Embedding | + | '''from''' keras.layers '''import''' Embedding |
− | from keras.layers import Conv1D, GlobalMaxPooling1D | + | '''from''' keras.layers '''import''' Conv1D, GlobalMaxPooling1D |
− | from keras.datasets import imdb | + | '''from''' keras.datasets '''import''' imdb |
− | # set parameters: | + | <font color="green"># set parameters:</font> |
− | max_features = 5000 | + | max_features = <font color="blue">5000</font> |
− | maxlen = 400 | + | maxlen = <font color="blue">400</font> |
− | batch_size = 32 | + | batch_size = <font color="blue">32</font> |
− | embedding_dims = 50 | + | embedding_dims = <font color="blue">50</font> |
− | filters = 250 | + | filters = <font color="blue">250</font> |
− | kernel_size = 3 | + | kernel_size = <font color="blue">3</font> |
− | hidden_dims = 250 | + | hidden_dims = <font color="blue">250</font> |
− | epochs = 2 | + | epochs = <font color="blue">2</font> |
(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=max_features) | (x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=max_features) | ||
− | print(len(x_train), 'train sequences') | + | print(len(x_train), <font color="red">'train sequences'</font>) |
− | print(len(x_test), 'test sequences') | + | print(len(x_test), <font color="red">'test sequences'</font>) |
− | print('Pad sequences (samples x time)') | + | print(<font color="red">'Pad sequences (samples x time)'</font>) |
x_train = sequence.pad_sequences(x_train, maxlen=maxlen) | x_train = sequence.pad_sequences(x_train, maxlen=maxlen) | ||
x_test = sequence.pad_sequences(x_test, maxlen=maxlen) | x_test = sequence.pad_sequences(x_test, maxlen=maxlen) | ||
− | print('x_train shape:', x_train.shape) | + | print(<font color="red">'x_train shape:'</font>, x_train.shape) |
− | print('x_test shape:', x_test.shape) | + | print(<font color="red">'x_test shape:'</font>, x_test.shape) |
model = Sequential() | model = Sequential() | ||
Строка 231: | Строка 231: | ||
embedding_dims, | embedding_dims, | ||
input_length=maxlen)) | input_length=maxlen)) | ||
− | model.add(Dropout(0.2)) | + | model.add(Dropout(<font color="blue">0.2</font>)) |
model.add(Conv1D(filters, | model.add(Conv1D(filters, | ||
kernel_size, | kernel_size, | ||
− | padding='valid', | + | padding=<font color="red">'valid'</font>, |
− | activation='relu', | + | activation=<font color="red">'relu'</font>, |
− | strides=1)) | + | strides=<font color="blue">1</font>)) |
model.add(GlobalMaxPooling1D()) | model.add(GlobalMaxPooling1D()) | ||
model.add(Dense(hidden_dims)) | model.add(Dense(hidden_dims)) | ||
− | model.add(Dropout(0.2)) | + | model.add(Dropout(<font color="blue">0.2</font>)) |
− | model.add(Activation('relu')) | + | model.add(Activation(<font color="red">'relu'</font>)) |
− | model.add(Dense(1)) | + | model.add(Dense(<font color="blue">1</font>)) |
− | model.add(Activation('sigmoid')) | + | model.add(Activation(<font color="red">'sigmoid'</font>)) |
− | model.compile(loss='binary_crossentropy', | + | model.compile(loss=<font color="red">'binary_crossentropy'</font>, |
− | optimizer='adam', | + | optimizer=<font color="red">'adam'</font>, |
− | metrics=['accuracy']) | + | metrics=[<font color="red">'accuracy'</font>]) |
model.fit(x_train, y_train, | model.fit(x_train, y_train, | ||
batch_size=batch_size, | batch_size=batch_size, |
Версия 11:29, 23 января 2019
Содержание
Scikit-learn
Описание
Scikit-learn[1] — библиотека машинного обучения на языке программирования Python с открытым исходным кодом. Содержит реализации практически всех возможных преобразований, и нередко ее одной хватает для полной реализации модели. В данной библиотеки реализованы методы разбиения датасета на тестовый и обучающий, вычисление основных метрик над наборами данных, проведение кросс-валидации. В библиотеке также есть основные алгоритмы машинного обучения: линейной регрессии, (и ее модификаций Лассо, гребневой регрессии), опорных векторов, решающих деревьев и лесов и др. Есть и реализации основных методов кластеризации. Кроме того, библиотека содержит постоянно используемые исследователями методы работы с параметрами (фичами): например, понижение размерности методом главных компонент. Частью пакета является библиотека imblearn[2], позволяющая работать с разбалансированными выборками и генерировать новые значения.
Примеры кода
Логистическая регрессия
Основная статья: Логистическая регрессия
Загрузка датасета:
from sklearn.datasets import load_digits digits = load_digits()
Вывод первых трех тренировочных данных для визуализации:
import numpy as np import matplotlib.pyplot as plt plt.figure(figsize=(20,4)) for index, (image, label) in enumerate(zip(digits.data[0:3], digits.target[0:3])): plt.subplot(1, 3, index + 1) plt.imshow(np.reshape(image, (8,8)), cmap=plt.cm.gray) plt.title('Training: %i\n' % label, fontsize = 20)
Разбиение датасета на тренировочный и тестовый:
from sklearn.model_selection import train_test_split x_train, x_test, y_train, y_test = train_test_split(digits.data, digits.target, test_size=0.25, random_state=0)
Построение и обучение модели:
from sklearn.linear_model import LogisticRegression lr = LogisticRegression() lr.fit(x_train, y_train) predictions = lr.predict(x_test)
Перцептрон
Основная статья: Нейронные сети, перцептрон
Загрузка датасета:
from sklearn import datasets iris = datasets.load_iris() X = iris.data y = iris.target
Разбиение датасета на тренировочный и тестовый:
from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.20)
Трансформация признаков:
from sklearn.preprocessing import StandardScaler scaler = StandardScaler() scaler.fit(X_train) X_train = scaler.transform(X_train) X_test = scaler.transform(X_test)
Построение и обучение модели:
from sklearn.neural_network import MLPClassifier mlp = MLPClassifier(hidden_layer_sizes=(10, 10, 10), max_iter=1000) mlp.fit(X_train, y_train.values.ravel()) predictions = mlp.predict(X_test)
Оценка алгоритма:
from sklearn.metrics import classification_report, confusion_matrix print(confusion_matrix(y_test,predictions)) print(classification_report(y_test,predictions))
Tensorflow
Описание
Tensorflow[3] — библиотека, разработанная корпорацией Google для работы с тензорами, используется для построения нейронных сетей. Поддержка вычислений на видеокартах имеет поддержку языка программирования C++. На основе данной библиотеки строятся более высокоуровневые библиотеки для работы с нейронными сетями на уровне целых слоев. Так, некоторое время назад популярная библиотека Keras стала использовать Tensorflow как основной бэкенд для вычислений вместо аналогичной библиотеки Theano. Для работы на видеокартах NVIDIA используется библиотека cuDNN. Если вы работаете с картинками (со сверточными нейросетями), скорее всего, придется использовать данную библиотеку.
Примеры кода
Сверточная нейронная сеть
Основная статья: Сверточные нейронные сети.
Реализация сверточной нейронной сети для классификации цифр из датасета MNIST:
from __future__ import division, print_function, absolute_import import tensorflow as tf # Import MNIST data from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets("/tmp/data/", one_hot=True) # Training Parameters learning_rate = 0.001 num_steps = 200 batch_size = 128 display_step = 10 # Network Parameters num_input = 784 # MNIST data input (img shape: 28*28) num_classes = 10 # MNIST total classes (0-9 digits) dropout = 0.75 # Dropout, probability to keep units # tf Graph input X = tf.placeholder(tf.float32, [None, num_input]) Y = tf.placeholder(tf.float32, [None, num_classes]) keep_prob = tf.placeholder(tf.float32) # dropout (keep probability) # Create some wrappers for simplicity def conv2d(x, W, b, strides=1): # Conv2D wrapper, with bias and relu activation x = tf.nn.conv2d(x, W, strides=[1, strides, strides, 1], padding='SAME') x = tf.nn.bias_add(x, b) return tf.nn.relu(x) def maxpool2d(x, k=2): # MaxPool2D wrapper return tf.nn.max_pool(x, ksize=[1, k, k, 1], strides=[1, k, k, 1], padding='SAME') # Create model def conv_net(x, weights, biases, dropout): # MNIST data input is a 1-D vector of 784 features (28*28 pixels) # Reshape to match picture format [Height x Width x Channel] # Tensor input become 4-D: [Batch Size, Height, Width, Channel] x = tf.reshape(x, shape=[-1, 28, 28, 1]) # Convolution Layer conv1 = conv2d(x, weights['wc1'], biases['bc1']) # Max Pooling (down-sampling) conv1 = maxpool2d(conv1, k=2) # Convolution Layer conv2 = conv2d(conv1, weights['wc2'], biases['bc2']) # Max Pooling (down-sampling) conv2 = maxpool2d(conv2, k=2) # Fully connected layer # Reshape conv2 output to fit fully connected layer input fc1 = tf.reshape(conv2, [-1, weights['wd1'].get_shape().as_list()[0]]) fc1 = tf.add(tf.matmul(fc1, weights['wd1']), biases['bd1']) fc1 = tf.nn.relu(fc1) # Apply Dropout fc1 = tf.nn.dropout(fc1, dropout) # Output, class prediction out = tf.add(tf.matmul(fc1, weights['out']), biases['out']) return out # Store layers weight & bias weights = { # 5x5 conv, 1 input, 32 outputs 'wc1': tf.Variable(tf.random_normal([5, 5, 1, 32])), # 5x5 conv, 32 inputs, 64 outputs 'wc2': tf.Variable(tf.random_normal([5, 5, 32, 64])), # fully connected, 7*7*64 inputs, 1024 outputs 'wd1': tf.Variable(tf.random_normal([7*7*64, 1024])), # 1024 inputs, 10 outputs (class prediction) 'out': tf.Variable(tf.random_normal([1024, num_classes])) } biases = { 'bc1': tf.Variable(tf.random_normal([32])), 'bc2': tf.Variable(tf.random_normal([64])), 'bd1': tf.Variable(tf.random_normal([1024])), 'out': tf.Variable(tf.random_normal([num_classes])) } # Construct model logits = conv_net(X, weights, biases, keep_prob) prediction = tf.nn.softmax(logits) # Define loss and optimizer loss_op = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits( logits=logits, labels=Y)) optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate) train_op = optimizer.minimize(loss_op) # Evaluate model correct_pred = tf.equal(tf.argmax(prediction, 1), tf.argmax(Y, 1)) accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32)) # Initialize the variables (i.e. assign their default value) init = tf.global_variables_initializer() # Start training with tf.Session() as sess: # Run the initializer sess.run(init) for step in range(1, num_steps+1): batch_x, batch_y = mnist.train.next_batch(batch_size) # Run optimization op (backprop) sess.run(train_op, feed_dict={X: batch_x, Y: batch_y, keep_prob: 0.8}) if step % display_step == 0 or step == 1: # Calculate batch loss and accuracy loss, acc = sess.run([loss_op, accuracy], feed_dict={X: batch_x, Y: batch_y, keep_prob: 1.0}) print("Step " + str(step) + ", Minibatch Loss= " + \ "{:.4f}".format(loss) + ", Training Accuracy= " + \ "{:.3f}".format(acc)) print("Optimization Finished!") # Calculate accuracy for 256 MNIST test images print("Testing Accuracy:", \ sess.run(accuracy, feed_dict={X: mnist.test.images[:256], Y: mnist.test.labels[:256], keep_prob: 1.0}))
Keras
Описание
Keras[4] — библиотека для построения нейронных сетей, поддерживающая основные виды слоев и структурные элементы. Поддерживает как рекуррентные, так и сверточные нейросети, имеет в своем составе реализацию известных архитектур нейросетей (например, VGG16). Некоторое время назад слои из данной библиотеки стали доступны внутри библиотеки Tensorflow. Существуют готовые функции для работы с изображениями и текстом. Интегрирована в Apache Spark с помощью дистрибутива dist-keras. Данная библиотека позволяет на более высоком уровне работать с нейронными сетями. В качестве библиотеки для бэкенда может использоваться как Tensorflow, так и Theano.
Примеры кода
Сверточная нейронная сеть
Основная статья: Сверточные нейронные сети.
Реализация сверточной нейронной сети для классификации текста:
from __future__ import print_function from keras.preprocessing import sequence from keras.models import Sequential from keras.layers import Dense, Dropout, Activation from keras.layers import Embedding from keras.layers import Conv1D, GlobalMaxPooling1D from keras.datasets import imdb # set parameters: max_features = 5000 maxlen = 400 batch_size = 32 embedding_dims = 50 filters = 250 kernel_size = 3 hidden_dims = 250 epochs = 2 (x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=max_features) print(len(x_train), 'train sequences') print(len(x_test), 'test sequences') print('Pad sequences (samples x time)') x_train = sequence.pad_sequences(x_train, maxlen=maxlen) x_test = sequence.pad_sequences(x_test, maxlen=maxlen) print('x_train shape:', x_train.shape) print('x_test shape:', x_test.shape) model = Sequential() model.add(Embedding(max_features, embedding_dims, input_length=maxlen)) model.add(Dropout(0.2)) model.add(Conv1D(filters, kernel_size, padding='valid', activation='relu', strides=1)) model.add(GlobalMaxPooling1D()) model.add(Dense(hidden_dims)) model.add(Dropout(0.2)) model.add(Activation('relu')) model.add(Dense(1)) model.add(Activation('sigmoid')) model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, validation_data=(x_test, y_test))
Другие библиотеки для машинного обучения на Python
- NumPy[5] — библиотека, добавляющая поддержку больших многомерных массивов и матриц, вместе с большой библиотекой высокоуровневых математических функций для операций с этими массивами. Данная библиотека предоставляет реализации вычислительных алгоритмов (в виде функций и операторов), оптимизированные для работы с многомерными массивами. В результате любой алгоритм, который может быть выражен в виде последовательности операций над массивами (матрицами) и реализованный с использованием NumPy, работает так же быстро, как эквивалентный код, выполняемый в MATLAB[6].
- SciPy[7] — открытая библиотека высококачественных научных инструментов для языка программирования Python. SciPy содержит модули для оптимизации, интегрирования, специальных функций, обработки сигналов, обработки изображений, генетических алгоритмов, решения обыкновенных дифференциальных уравнений и других задач, обычно решаемых в науке и при инженерной разработке.
- Pandas[8] — библиотека Python, которая является мощным инструментом для анализа данных. Пакет дает возможность строить сводные таблицы, выполнять группировки, предоставляет удобный доступ к табличным данным и позволяет строить графики на полученных наборах данных при помощи библиотеки Matplotlib.
- Matplotlib[9] — библиотека Python для построения качественных двумерных графиков. Matplotlib является гибким, легко конфигурируемым пакетом, который вместе с NumPy, SciPy и IPython[10] предоставляет возможности, подобные MATLAB.
- Theano[11] — расширение языка программирования Python, позволяющее эффективно вычислять математические выражения, содержащие многомерные массивы. Библиотека предоставляет базовый набор инструментов для конфигурации нейронных сетей и их обучения. Наибольшее признание данная библиотека получила в задачах машинного обучения при решении задач оптимизации. Она позволяет использовать возможности GPU без изменения кода программы, что делает ее незаменимой при выполнении ресурсоемких задач.
- Caffe[12] — фреймворк для обучения нейронных сетей, созданный университетом Беркли. Как и Tensorflow, использует cuDNN для работы с видеокартами NVIDIA.
- NLTK[13] — пакет библиотек и программ для символьной и статистической обработки естественного языка, написанных на языке программирования Python.
- Gensim[14] — инструмент для автоматической обработки языка, основанный на машинном обучении. В Gensim реализованы алгоритмы дистрибутивной семантики word2vec и doc2vec, он позволяет решать задачи тематического моделирования и выделять основные темы текста или документа.
- Xgboost[15] — библиотека с реализацией градиентного бустинга, которая для выбора разбиения использует сортировку и модели, основанные на анализе гистограмм.
- LightGBM[16] — фреймворк с реализацией градиентного бустинга от корпорации Microsoft. Является частью проекта Microsoft DMTK, посвященного реализации подходов машинного обучения для .Net.
- CatBoost[17] — библиотека с градиентным бустингом от компании Яндекс, в которой реализуется особый подход к обработке категориальных признаков, основанный на подмене категориальных признаков статистиками на основе предсказываемого значения.
- Microsoft Cognitive Toolkit (CNTK)[18] — фреймворк от корпорации Microsoft, предоставляющий реализации архитектур различных нейронных сетей.
См. также
Примечания
- ↑ Библиотека scikit-learn
- ↑ Библиотека imbalanced-learn
- ↑ Библиотека Tensorflow
- ↑ Библиотека Keras
- ↑ Библиотека NumPy
- ↑ MATLAB
- ↑ Библиотека SciPy
- ↑ Библиотека Pandas
- ↑ Библиотека Matplotlib
- ↑ IPython Notebook
- ↑ Библиотека Theano
- ↑ Библиотека Caffe
- ↑ Библиотека NLTK
- ↑ Библиотека Gensim
- ↑ Библиотека Xgboost
- ↑ Библиотека LightGBM
- ↑ Библиотека CatBoost
- ↑ Библиотека CNTK