Добро пожаловать на главный сайт 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, которое варьируется от задачи к задаче. В одномерном случае нам нужно усреднитьсмысл. В приведенном выше примере KNN, если данные имеют только один признак со значением от 0 до 1 и имеется n точек выборки, то новые данные всегда могут находиться на расстоянии менее 1/n от соседних точек. Следовательно, алгоритм ближайшего соседа всегда эффективен, когда отклонение 1/n мало по сравнению с неоднородными признаками.
Предположим, что количество признаков не 1, а, то вам нужноточка. Например, в одномерном случае нам нужно 10 точек, тогдатребуется в случаеточек, чтобы заполнить пространство [0,1]. вместе сувеличивается, количество точек обучения, поддерживающих эффективный предиктор, будет расти экспоненциально.
Например, если каждая точка представляет собой 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。
Линейная регрессия
Простейшая линейная регрессия соответствует линейной модели путем настройки ряда параметров для минимизации суммы квадратов отклонений (наименьших квадратов).
Линейная модель: данныецелевая переменнаякоэффициентшум дискретизации
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 — это дискриминационные модели: попытка найти набор примеров для построения плоскости, максимально увеличивающей расстояние между двумя классами. параметрУстановлена регуляризация: меньшие значенияОбъясните, что «пространство» рассчитывается из большего количества или даже всех точек выборки вокруг разделительной линии (более регулярно);Объясните, что «пространство» рассчитывается только из точек выборки вблизи разделительной линии (низкая регуляризация).
Машины опорных векторов можно использовать для регрессии — 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分别训练模型。