[Scikit-learn Tutorial] 02.02 Прогнозирование результатов многомерной выборки

машинное обучение искусственный интеллект Python
[Scikit-learn Tutorial] 02.02 Прогнозирование результатов многомерной выборки

Добро пожаловать на главный сайт Jizhi:Jizhi, двигатель, ведущий к эре интеллекта


Уведомление!

Весь код в этой статье можно запустить и отладить в оригинальном посте Jizhi (установочная среда не требуется).кликните сюдаперейти к исходному сообщению



Проблемы, решаемые машинным обучением

Обучение с учителем находит ассоциации из двух наборов данных: наблюдаемых данных X и данных y, которые мы хотим предсказать (называемых «целями» или «метками»). Обычно y представляет собой одномерный массив длины n_samples. Все предикторы с учителем в Scikit-learn предоставляют: метод fit(X,y) для построения подобранной модели; метод прогнозирования(X), ввод немаркированного образца X, возврат предсказанной метки y.

Терминология: классификация и регрессия

Если цель предсказания состоит в том, чтобы классифицировать выборки с конечным числом меток, другими словами, «назвать» объект выборки, то этоКлассификацияЗадача. И наоборот, если цель состоит в том, чтобы предсказать непрерывную целевую переменную, товозвращениеЗадача.

В классификации Scikit-learn y — это вектор целых чисел или символов.

Классификация ближайших соседей и проклятие размерности

Категория Ирис

Набор данных об ирисах используется для задачи классификации: определить 3 разных ириса (Setosa, Versicolour, Virginica) на основе длины/ширины лепестков/чашелистиков.

# 导入数值计算库Numpy,以及Scikit-learn中的数据集
import numpy as np
from sklearn import datasets

# 从数据集中导入鸢尾花
iris = datasets.load_iris()

# 将特征数据赋值给iris_X,标签数据赋值给iris_y
iris_X = iris.data
iris_y = iris.target

# 输出iris_y的不重复元素
np.unique(iris_y)
# 导入数值计算库Numpy,以及Scikit-learn中的数据集
import numpy as np
from sklearn import datasets

# 从数据集中导入鸢尾花
iris = datasets.load_iris()

# 将特征数据赋值给iris_X,标签数据赋值给iris_y
iris_X = iris.data
iris_y = iris.target

# 输出iris_y的不重复元素
np.unique(iris_y)
len(np.unique(iris_y)) == 3

k-алгоритм ближайшего соседа

Алгоритм ближайшего соседа является простейшим практическим классификатором: для каждой новой выборкиX_test, чтобы найти ближайшую выборку к вектору признаков в обучающем наборе (данные, используемые для обучения предиктора).

обучающий набор и тестовый набор

Для любого алгоритма обучения невозможно сверить результаты предсказания предиктора с данными, которые уже участвовали в обучении, потому что это не измеряет применимость предиктора к новым данным. Вот почему набор данных разделен на обучающий набор и тестовый набор. Конечно, если ваш фундамент Python еще не прочный, вы также можетеУмный классукрепить фундамент

import numpy as np
from sklearn import datasets
iris = datasets.load_iris()
iris_X = iris.data
iris_y = iris.target
# 将数据集随机划分为训练集合测试集
np.random.seed(0)

indices = np.random.permutation(len(iris_X))
iris_X_train = iris_X[indices[:-10]]
iris_y_train = iris_y[indices[:-10]]
iris_X_test  = iris_X[indices[-10:]]
iris_y_test  = iris_y[indices[-10:]]

# 从Scikit-learn库中导入分类器并创建对象knn
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier()

# 用训练集拟合数据
knn.fit(iris_X_train, iris_y_train) 

# 用测试集进行实地预测
iris_y_predict = knn.predict(iris_X_test)
print('iris_y_predict = ')
print(iris_y_predict)

# 与测试集标签进行对比
iris_y_test
print('iris_y_test = ')
print(iris_y_test)
# 将数据集随机划分为训练集合测试集
np.random.seed(0)

indices = np.random.permutation(len(iris_X))
iris_X_train = iris_X[indices[:-10]]
iris_y_train = iris_y[indices[:-10]]
iris_X_test  = iris_X[indices[-10:]]
iris_y_test  = iris_y[indices[-10:]]

# 从Scikit-learn库中导入分类器并创建对象knn
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier()

# 用训练集拟合数据
knn.fit(iris_X_train, iris_y_train) 

# 用测试集进行实地预测
iris_y_predict = knn.predict(iris_X_test)
print('iris_y_predict = ')
print(iris_y_predict)

# 与测试集标签进行对比
iris_y_test
print('iris_y_test = ')
print(iris_y_test)
用K近邻分类器做分类,并将结果赋值予变量iris_y_predict


проклятие размерности

Для эффективного предиктора необходимо, чтобы расстояние между соседними выборками было меньше определенного значения d, которое варьируется от задачи к задаче. В одномерном случае нам нужно усреднитьn(~1/d)смысл. В приведенном выше примере KNN, если данные имеют только один признак со значением от 0 до 1 и имеется n точек выборки, то новые данные всегда могут находиться на расстоянии менее 1/n от соседних точек. Следовательно, алгоритм ближайшего соседа всегда эффективен, когда отклонение 1/n мало по сравнению с неоднородными признаками.

Предположим, что количество признаков не 1, аp, то вам нужноn~1/d^{p}точка. Например, в одномерном случае нам нужно 10 точек, тогдаpтребуется в случае10^{p}точек, чтобы заполнить пространство [0,1]. вместе сpувеличивается, количество точек обучения, поддерживающих эффективный предиктор, будет расти экспоненциально.

Например, если каждая точка представляет собой 8-байтовое число, то тренировочные точки, необходимые для предсказателя KNN только с размерностями p ~ 20, уже превышают общий размер данных текущего Интернета (около 1000 экзабайт). Это проклятие размерности и одна из основных проблем машинного обучения.

Линейные модели: от регрессии к разреженным

Набор данных диабета

Набор данных содержит 10 характеристических переменных (возраст, пол, вес, артериальное давление) от 442 пациентов и показатели прогрессирования заболевания через год.

Теперь задача состоит в том, чтобы предсказать изменения состояния на основе текущих знаковых переменных.

from sklearn import datasets
# 导入diabetes数据集并赋值予同名变量
diabetes = datasets.load_diabetes()

# 划分训练集与测试集,测试集样本量为20
diabetes_X_train = diabetes.data[:-20]
diabetes_X_test  = diabetes.data[-20:]
diabetes_y_train = diabetes.target[:-20]
diabetes_y_test  = diabetes.target[-20:]
# 导入diabetes数据集并赋值予同名变量
diabetes = datasets.load_diabetes()

# 划分训练集与测试集,测试集样本量为20
diabetes_X_train = diabetes.data[:-20]
diabetes_X_test  = diabetes.data[-20:]
diabetes_y_train = diabetes.target[:-20]
diabetes_y_test  = diabetes.target[-20:]
len(diabetes_X_train) == 20
导入diabetes数据集并赋值予同名变量。
划分训练集与测试集,测试集样本量为20。

Линейная регрессия

Простейшая линейная регрессия соответствует линейной модели путем настройки ряда параметров для минимизации суммы квадратов отклонений (наименьших квадратов).

Линейная модель:y = X\beta + \epsilon X:данныеy:целевая переменная\beta:коэффициент\epsilon:шум дискретизации

diabetes = datasets.load_diabetes()
diabetes_X_train = diabetes.data[:-20]
diabetes_X_test  = diabetes.data[-20:]
diabetes_y_train = diabetes.target[:-20]
diabetes_y_test  = diabetes.target[-20:]
from sklearn import linear_model

# 建立线性回归模型对象
regr = linear_model.LinearRegression()
regr.fit(diabetes_X_train, diabetes_y_train)
print(regr.coef_)

# 偏差平方和
np.mean((regr.predict(diabetes_X_test)-diabetes_y_test)**2)

# 偏差解释:1代表完美预测,0表示X和y毫无线性关系E
score = regr.score(diabetes_X_test, diabetes_y_test)
print(score)
from sklearn import linear_model

# 建立线性回归模型对象
regr = linear_model.LinearRegression()
regr.fit(diabetes_X_train, diabetes_y_train)
print(regr.coef_)

# 偏差平方和
np.mean((regr.predict(diabetes_X_test)-diabetes_y_test)**2)

# 偏差解释:1代表完美预测,0表示X和y毫无线性关系E
score = regr.score(diabetes_X_test, diabetes_y_test)
print(score)
score > 0.5
用线性回归模型对糖尿病数据集做预测并输出测试得分

Метод опорных векторов (SVM)

Линейная машина опорных векторов

SVM — это дискриминационные модели: попытка найти набор примеров для построения плоскости, максимально увеличивающей расстояние между двумя классами. параметрCУстановлена ​​регуляризация: меньшие значенияCОбъясните, что «пространство» рассчитывается из большего количества или даже всех точек выборки вокруг разделительной линии (более регулярно);CОбъясните, что «пространство» рассчитывается только из точек выборки вблизи разделительной линии (низкая регуляризация).

左:未正则化的SVM;右:正则化SVM(默认设置)

Машины опорных векторов можно использовать для регрессии — SVR (регрессия опорных векторов) или классификации — SVC (классификация опорных векторов).

from sklearn import svm

# 创建SVC对象,并使用线性核函数
svc = svm.SVC(kernel='linear')
svc.fit(iris_X_train, iris_y_train) 
from sklearn import svm

# 创建SVC对象,并使用线性核函数
svc = svm.SVC(kernel='linear')
svc.fit(iris_X_train, iris_y_train)  
创建SVC对象,并使用线性核函数

намекать:нормализованные данные Для многих предикторов, включая SVM, наличие единичного стандартного отклонения для каждой функции набора данных помогает получить хорошие прогнозы.

Используйте функцию ядра (kernel)

В пространстве признаков разные классы не всегда линейно разделимы. Решение состоит в том, чтобы построить нелинейные решающие функции, такие как полиномиальные функции, которые могут быть достигнуты с помощью трюка с функцией ядра: используйте функцию ядра для выборок, чтобы назначить разные веса решения.

线性核

svc = svm.SVC(kernel='linear')

多项式核

svc = svm.SVC(kernel='poly', degree=3)

基于半径的核

svc = svm.SVC(kernel='rbf')

Упражнение

Попробуйте использовать только первые две функции для классификации категорий 1 и 2 набора данных радужной оболочки с помощью машины опорных векторов. Отложите 10% для каждой категории в качестве тестового набора.

предупреждать:Категории отсортированы, не оставляйте последние 10%, иначе тест будет выполнен только для одной категории.

намекать:Можно использовать на сеткеdecision_functionметод получения интуитивной информации.

from sklearn import datasets
%matplotlib inline
iris = datasets.load_iris()
X = iris.data
y = iris.target

X = X[y != 0, :2]
y = y[y != 0]

# 以下由读者完成整个程序
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets, svm

# 样本容量
n_sample = len(X)

# 产生随机序列用于划分训练集/测试集
np.random.seed(0)
order = np.random.permutation(n_sample)
X = X[order]
y = y[order].astype(np.float)

X_train = X[:.9 * n_sample]
y_train = y[:.9 * n_sample]
X_test = X[.9 * n_sample:]
y_test = y[.9 * n_sample:]

# 对不同kernel分别训练模型
for fig_num, kernel in enumerate(('linear', 'rbf', 'poly')):
    clf = svm.SVC(kernel=kernel, gamma=10)
    clf.fit(X_train, y_train)

    plt.figure(fig_num)
    plt.clf()
    plt.scatter(X[:, 0], X[:, 1], c=y, zorder=10, cmap=plt.cm.Paired)

    # 输出测试数据图表
    plt.scatter(X_test[:, 0], X_test[:, 1], s=80, facecolors='none', zorder=10)

    plt.axis('tight')
    x_min = X[:, 0].min()
    x_max = X[:, 0].max()
    y_min = X[:, 1].min()
    y_max = X[:, 1].max()

    XX, YY = np.mgrid[x_min:x_max:200j, y_min:y_max:200j]
    Z = clf.decision_function(np.c_[XX.ravel(), YY.ravel()])

    # 将计算结果加入图表
    Z = Z.reshape(XX.shape)
    plt.pcolormesh(XX, YY, Z > 0, cmap=plt.cm.Paired)
    plt.contour(XX, YY, Z, colors=['k', 'k', 'k'], linestyles=['--', '-', '--'],
                levels=[-.5, 0, .5])

    plt.title(kernel)
plt.show()
随机划分训练/测试集,对三种不同的kernel分别训练模型。

参考输出结果




Рекомендуемое чтение

Семинар TensorFlow «Фестиваль технологического опыта для девочек»

Этот комментарий ядовит! ——Общая процедура для классификации текста

Я сделал робота по имени Серсея, но она просто хотела, чтобы сир Грегор убивал меня на каждом шагу.