Учебник по основам машинного обучения Python: классификация радужной оболочки

Python

Сначала импортируйте необходимые библиотеки:

import numpy as np 
import matplotlib.pyplot as plt 
import pandas as pd 
import mglearn
from sklearn.datasets import load_iris
iris_dataset = load_iris()

Объект iris, возвращаемый load_iris, представляет собой объект Bunch, очень похожий на словарь, содержащий ключи и значения. Этот класс напрямую наследует класс dict, поэтому мы естественным образом можем получить множество функций класса dict, например обход ключей/значений или просто запрос о существовании атрибута.

Метод построения структуры связки (должен быть в пакете sklearn):

class Bunch(dict):
    
    def __init__(self, *args, **kwds):

        super().__init__(*args, **kwds)
        self.__dict__ = self

* параметры, которые могут заставить функцию принимать любое количество позиционных параметров

def avg(first, *rest): 
return (first + sum(rest)) / (1 + len(rest))
# Sample use 
avg(1, 2) # 1.5 
avg(1, 2, 3, 4) # 2.5

**аргументы, заставьте функцию принимать любое количество аргументов ключевого слова

def make_element(name, value, **attrs): 
....
make_element('item', 'Albatross', size='large', quantity=6)

пример:

x = Bunch(a='1',b='2',c='3')
print(x.a)
print(x.b)
print(x.c)
输出:
1
2
3
T = Bunch
t = T(left = T(left='a',right='b'),right = T(left='c'))
print(t.left)
print(t.left.right)
print(t['left']['right'])
print('left' in t.right)
print('right' in t.right)
输出:
{'left': 'a', 'right': 'b'}
b
b
True
False

print('Keys of iris_dataset: \n{}'.format(iris_dataset.keys()))
输出:
Keys of iris_dataset: 
dict_keys(['data', 'target', 'target_names', 'DESCR', 'feature_names', 'filename'])

Значение, соответствующее ключу target_names, представляет собой массив строк, содержащих сорта цветов, которые мы хотим предсказать:

print('Target names: {}'.format(iris_dataset['target_names']))
输出:
Target names: ['setosa' 'versicolor' 'virginica']

Значение, соответствующее ключу feature_names, представляет собой список строк, описывающих каждую функцию:

print('Feature names: \n{}'.format(iris_dataset['feature_names']))
输出:
Feature names: 
['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']

Данные содержатся в полях target и data. Данные содержат данные измерений длины чашелистика, ширины чашелистика, длины лепестка и ширины лепестка, а формат представляет собой массив NumPy. Каждая строка массива данных соответствует цветку, а столбцы представляют четыре измерения каждого цветка. Функция формы может просматривать размер матрицы или массива, (150,4) относится к массиву со 150 строками и 4 столбцами:

print('Type of data: {}'.format(type(iris_dataset['data'])))
print('Shape of data: {}'.format(iris_dataset['data'].shape))
输出:
Type of data: <class 'numpy.ndarray'>
Shape of data: (150, 4)

Собственные значения первых 5 выборок:

print('First five rows of data:\n{}'.format(iris_dataset['data'][:5]))
输出:
First five rows of data:
[[5.1 3.5 1.4 0.2]
 [4.9 3.  1.4 0.2]
 [4.7 3.2 1.3 0.2]
 [4.6 3.1 1.5 0.2]
 [5.  3.6 1.4 0.2]]

Индивидуумы в машинном обучении называются образцами, а их атрибуты — признаками. Форма массива данных — это количество выборок, умноженное на количество признаков.
Целевой массив содержит измеренное разнообразие каждого цветка, а также является массивом NumPy. target представляет собой одномерный массив, каждому цветку соответствует одно из данных. Значение чисел представленоiris_dataset['target_names']Массив дает 0 для Setosa, 1 для Versicolor и 2 для Виржики:

print('Type of target:{}'.format(type(iris_dataset['target'])))
print('Shape of target: {}'.format(iris_dataset['target'].shape))
print('Target:\n{}'.format(iris_dataset['target']))
输出:
Type of target:<class 'numpy.ndarray'>
Shape of target: (150,)
Target:
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 2 2]

в scikit-learntrain_test_splitФункции могут перемешивать набор данных и разделять его. Данные в scikit-learn обычно обозначаются буквой X в верхнем регистре, а метки — буквой y в нижнем регистре. Прежде чем разделить данные,train_test_splitФункция перемешивает набор данных с помощью генератора псевдослучайных чисел. Чтобы убедиться, что запуск одной и той же функции несколько раз дает один и тот же результат, используйте параметр random_state для указания начального числа генератора случайных чисел. Таким образом, вывод функции фиксирован, поэтому вывод этой строки кода всегда одинаков.

from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(
    iris_dataset['data'], iris_dataset['target'],random_state=0)

train_test_splitРезультат функцииX_train,X_test,y_trainиy_test, которые оба являются массивами NumPy.X_trainсодержит 75% данных строки,X_testСодержит оставшиеся 25%:

print('X_train shape: {}'.format(X_train.shape))
print('y_train shape: {}'.format(y_train.shape))

print('X_test shape: {}'.format(X_test.shape))
print('y_test shape: {}'.format(y_test.shape))
输出:
X_train shape: (112, 4)
y_train shape: (112,)

X_test shape: (38, 4)
y_test shape: (38,)

Создайте DataFrame из данных в X_train. использоватьiris_dataset['feature_names']Строка для обозначения столбца данных. Создайте матрицу диаграммы рассеяния из DataFrame, окрашенную y_train.

iris_dataframe = pd.DataFrame(X_train,columns = iris_dataset['feature_names'])
grr = pd.plotting.scatter_matrix(iris_dataframe,c=y_train,figsize=(15,15),
marker='o',hist_kwds={'bins':20},s=60,alpha=.8,cmap=mglearn.cm3)

Примечание. Пакет mglearn — это пакет, написанный самим автором в книге.

Все модели машинного обучения в scikit-learn реализованы в собственных классах, которые называются классами Estimator. Алгоритм классификации k-ближайших соседей реализован в классе KNeighborsClassifier модуля Neighbours. Нам нужно создать экземпляр этого класса как объекта, прежде чем мы сможем использовать эту модель. На этом этапе нам нужно установить параметры модели. Самый важный параметр KNeighborsClassifier — количество соседей, здесь мы устанавливаем его равным 1.

from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=1)

Объект knn инкапсулирует алгоритмы, в том числе те, которые строят модели на основе обучающих данных, и те, которые делают прогнозы относительно новых точек данных. Он также включает информацию, которую алгоритм извлекает из обучающих данных. Для KNeighborsClassifier сохраняется только обучающий набор.

Для построения модели на основе обучающей выборки необходимо вызвать метод fit объекта knn, Входные параметрыX_trainиy_ train, оба из которых являются массивами NumPy, Первый содержит данные обучения, а второй содержит соответствующие метки обучения.

knn.fit(X_train,y_train)

Метод fit возвращает сам объект knn, измененный на месте, поэтому мы получаем строковое представление классификатора. Отсюда вы можете увидеть параметры, используемые при построении модели.

Если цветок ириса найден в дикой природе, Чашечка 5 см в длину и 2,9 см в ширину, а лепестки 1 см в длину и 0,2 см в ширину. Хотите знать, к какому виду относится этот ирис? Мы можем поместить эти данные в массив NumPy, Снова вычислите форму, форма массива - это количество выборок (1), умноженное на количество признаков (4):

X_new = np.array([[5,2.9,1,0.2]])

Преобразуем данные измерений для этого цветка в одну строку двумерного массива NumPy, Это связано с тем, что входные данные для scikit-learn должны быть двумерным массивом.

Вызовите метод predict объекта knn, чтобы сделать прогнозы:

prediction = knn.predict(X_new)
print('Prediction:{}'.format(prediction))
print('Predicted target name:{}'.format(iris_dataset['target_names'][prediction]))
输出:
Prediction:[0]
Predicted target name:['setosa']

То есть по прогнозу модели этот новый ирис относится к категории 0, а значит относится к сорту сетоза

Окончательная модель оценкиСделайте прогноз для каждого ириса в тестовых данных и сравните прогноз с этикеткой (известный сорт). Мы можем измерить плюсы и минусы модели, рассчитав точность (accuracy), которая представляет собой долю цветов, которую сорт предсказывает правильно:

y_pred = knn.predict(X_test)
print('Test set predictions:\n{}'.format(y_pred))

print('Test set score:{:.2f}'.format(np.mean(y_pred == y_test)))
#保留小数后两位
输出:
Test set predictions:
[2 1 0 2 0 2 0 1 1 1 2 1 1 1 1 0 1 1 0 0 2 1 0 0 2 0 0 1 1 0 2 1 0 2 2 1 0
 2]
Test set score:0.97

Подробнее о том, как использовать функцию форматирования, см.ооооооооооооооооооооооооооооооооооооооооооооооооооооооооооо.com/Python/ATT-…