Добро пожаловать на главный сайт Jizhi:Jizhi, двигатель, ведущий к эре интеллекта
Уведомление!
Весь код в этой статье можно запустить и отладить в оригинальном посте Jizhi (установочная среда не требуется).кликните сюдаперейти к исходному сообщению
Оценка против оценки перекрестной проверки
Как было показано ранее, каждый объект-предиктор поставляется сscore
метод определения качества соответствия (или прогноза) новым данным, конечно, чем выше, тем лучше.
Пример: Классифицируйте наборы числовых данных с классификацией опорных векторов и присваивайте баллы переменным.score_svc
.
# 从Scikit-learn库中导入数据集和支持向量机两个模块
from sklearn import datasets, svm
# 加载数字数据集并分别读入特征和标签
digits = datasets.load_digits()
X_digits = digits.data
y_digits = digits.target
# 支持向量分类
svc = svm.SVC(C=1, kernel='linear')
score_svc = svc.fit(X_digits[:-100], y_digits[:-100]).score(X_digits[-100:], y_digits[-100:])
# 从Scikit-learn库中导入数据集和支持向量机两个模块
from sklearn import datasets, svm
# 加载数字数据集并分别读入特征和标签
digits = datasets.load_digits()
X_digits = digits.data
y_digits = digits.target
# 支持向量分类
svc = svm.SVC(C=1, kernel='linear')
score_svc = svc.fit(X_digits[:-100], y_digits[:-100]).score(X_digits[-100:], y_digits[-100:])
score_svc > 0.9
KFold перекрестная проверка
Чтобы повысить точность прогноза, мы можем разделить данные обучения/тестирования на несколько частей:
from sklearn import datasets, svm
digits = datasets.load_digits()
X_digits = digits.data
y_digits = digits.target
svc = svm.SVC(C=1, kernel='linear')
import numpy as np
# 将数据分为3份
X_folds = np.array_split(X_digits, 3)
y_folds = np.array_split(y_digits, 3)
scores_cross = list()
# 对每组数据分别用SVC做分类,并输出结果得分
for k in range(3):
# 用list()函数复制以便之后通过pop()方法调用
X_train = list(X_folds)
X_test = X_train.pop(k)
X_train = np.concatenate(X_train)
y_train = list(y_folds)
y_test = y_train.pop(k)
y_train = np.concatenate(y_train)
# SVC分类并将得分添加至scores_cross变量
scores_cross.append(svc.fit(X_train, y_train).score(X_test, y_test))
print(scores)
import numpy as np
# 将数据分为3份
X_folds = np.array_split(X_digits, 3)
y_folds = np.array_split(y_digits, 3)
scores_cross = list()
# 对每组数据分别用SVC做分类,并输出结果得分
for k in range(3):
# 用list()函数复制以便之后通过pop()方法调用
X_train = list(X_folds)
X_test = X_train.pop(k)
X_train = np.concatenate(X_train)
y_train = list(y_folds)
y_test = y_train.pop(k)
y_train = np.concatenate(y_train)
# SVC分类并将得分添加至scores_cross变量
scores_cross.append(svc.fit(X_train, y_train).score(X_test, y_test))
print(scores)
np.mean(scores_cross) > 0.9
генератор перекрестной проверки
В Scikit-learn есть набор классов, которые можно использовать для создания массивов последовательностей обучения/тестирования для стратегий перекрестной проверки. Эти классы обеспечиваютsplit
Метод принимает набор данных для разделения в качестве входного параметра, а затем создает массив последовательностей, который действует как итеративная основа при перекрестной проверке.
Следующий пример демонстрируетsplit
Цель метода:
import numpy as np
from sklearn import datasets, svm
svc = svm.SVC(C=1, kernel='linear')
digits = datasets.load_digits()
X_digits = digits.data
y_digits = digits.target
from sklearn.cross_validation import KFold, cross_val_score
X = ["a", "a", "b", "c", "c", "c"]
k_fold = KFold(n=6, n_folds=3)
for train_indices, test_indices in k_fold:
print('Train: %s | test: %s' % (train_indices, test_indices))
scores_kf = [svc.fit(X_digits[train], y_digits[train]).score(X_digits[test], y_digits[test]) for train, test in k_fold]
from sklearn.cross_validation import KFold, cross_val_score
X = ["a", "a", "b", "c", "c", "c"]
k_fold = KFold(n=6,n_folds=3)
for train_indices, test_indices in k_fold:
print('Train: %s | test: %s' % (train_indices, test_indices))
scores_kf = [svc.fit(X_digits[train], y_digits[train]).score(X_digits[test], y_digits[test]) for train, test in k_fold]
np.mean(scores_kf) > 0.9
Оценки перекрестной проверки доступны по адресуcross_val_score
можно рассчитать непосредственно с помощью . Учитывая определенный предиктор, объект перекрестной проверки и набор входных данных,cross_val_scroe
Итеративно разделите данные на обучающие/тестовые наборы, обучите предиктор на обучающем наборе и рассчитайте оценку для каждой итерации на основе тестового набора.
По умолчанию предикторscore
Метод используется для расчета каждого балла.
from sklearn import datasets, svm
svc = svm.SVC(C=1, kernel='linear')
digits = datasets.load_digits()
X_digits = digits.data
y_digits = digits.target
# n_jobs=-1表示计算将被分配到计算机的所有CPU上
#'scoring'参数可以指定特别的得分计算方式
cross_val_score(svc, X_digits, y_digits, cv=k_fold, n_jobs=-1,scoring='precision_macro')
# n_jobs=-1表示计算将被分配到计算机的所有CPU上
#'scoring'参数可以指定特别的得分计算方式
cross_val_score(svc, X_digits, y_digits, cv=k_fold, n_jobs=-1,scoring='precision_macro')
# n_jobs=-1表示计算将被分配到计算机的所有CPU上
运行示例代码,查看输出结果。
KFold (n_splits, shuffle, random_state) | StratifiedKFold (n_iter, test_size, train_size, random_state) | GroupKFold (n_splits, shuffle, random_state) |
---|---|---|
Разделенный на K частей, K-1 используется для обучения, а остальные используются для тестирования | То же, что и K-Fold, но сохраняет распределение классов для каждой группы | Убедитесь, что один и тот же набор данных не отображается как в обучающем, так и в тестовом наборах. |
ShuffleSplit (n_iter, test_size, train_size, random_state) | StratifiedShuffleSplit | GroupShuffleSplit |
Случайным образом генерировать последовательности поездов/тестов | То же, что и разделение в случайном порядке, но сохраняет распределение классов S на каждой итерации. | Убедитесь, что один и тот же набор данных не отображается как в обучающем, так и в тестовом наборах. |
LeaveOneGroupOut () | LeavePGroupsOut (p) | LeaveOneOut () |
удалить группу | Устранить P-группы | удалить 1 образец |
LeavePOut (p) | PredefinedSplit | |
Устранить образцы P | Создавайте последовательности обучения/тестирования на основе предопределенных разделений. |
Упражнение:
Для набора данных цифр постройте показатель перекрестной проверки предиктора SVC (линейное ядро) как функцию параметра C (используя логарифмическую ось, от 1 до 10).
%matplotlib inline
import numpy as np
from sklearn.cross_validation import cross_val_score
from sklearn import datasets, svm
digits = datasets.load_digits()
X = digits.data
y = digits.target
svc = svm.SVC(kernel='linear')
C_s = np.logspace(-10, 0, 10)
# 以下由读者完成全部程序
import numpy as np
from sklearn.cross_validation import cross_val_score
from sklearn import datasets, svm
digits = datasets.load_digits()
X = digits.data
y = digits.target
svc = svm.SVC(kernel='linear')
C_s = np.logspace(-10, 0, 10)
scores = list()
scores_std = list()
for C in C_s:
svc.C = C
this_scores = cross_val_score(svc, X, y, n_jobs=1)
scores.append(np.mean(this_scores))
scores_std.append(np.std(this_scores))
# 绘制图象
import matplotlib.pyplot as plt
plt.figure(1, figsize=(4, 3))
plt.clf()
plt.semilogx(C_s, scores)
plt.semilogx(C_s, np.array(scores) + np.array(scores_std), 'b--')
plt.semilogx(C_s, np.array(scores) - np.array(scores_std), 'b--')
locs, labels = plt.yticks()
plt.yticks(locs, list(map(lambda x: "%g" % x, locs)))
plt.ylabel('CV score')
plt.xlabel('Parameter C')
plt.ylim(0, 1.1)
plt.show()
Поиск по сетке и предикторы перекрестной проверки
поиск по сетке
Scikit-learn предоставляет объект, который вычисляет оценку соответствия предиктора для заданных данных в сетке параметров и выбирает соответствующие параметры для получения максимальной оценки перекрестной проверки. Этот объект построен с использованием предиктора в качестве входных данных и предоставляет API предиктора:
import numpy as np
from sklearn import datasets, svm
svc = svm.SVC(kernel='linear')
from sklearn.grid_search import GridSearchCV
from sklearn.cross_validation import cross_val_score
Cs = np.logspace(-6, -1, 10)
# 构建分类器对象
clf = GridSearchCV(estimator=svc, param_grid=dict(C=Cs), n_jobs=-1)
clf.fit(X_digits[:1000], y_digits[:1000])
# 获取并输出最佳得分
score_best = clf.best_score_
print(score_best)
# 获取并输出最佳得分对应的参数C
C_best = clf.best_estimator_.C
print(C_best)
# 测试集上的预测表现不如训练集
score_train = clf.score(X_digits[1000:], y_digits[1000:])
print(score_train)
from sklearn.grid_search import GridSearchCV
from sklearn.cross_validation import cross_val_score
Cs = np.logspace(-6, -1, 10)
# 构建分类器对象
clf = GridSearchCV(estimator=svc, param_grid=dict(C=Cs), n_jobs=-1)
clf.fit(X_digits[:1000], y_digits[:1000])
# 获取并输出最佳得分
score_best = clf.best_score_
print(score_best)
# 获取并输出最佳得分对应的参数C
C_best = clf.best_estimator_.C
print(C_best)
# 测试集上的预测表现不如训练集
score_train = clf.score(X_digits[1000:], y_digits[1000:])
print(score_train)
score_best > 0.9
用GridSearchCV()函数生成参数样本空间,使参数C迭代并计算相应预测得分。
По умолчанию,GridSearchCV
Используйте 3-кратную перекрестную проверку. Но если программа обнаружит, что входной параметр является классификатором, а не регрессором, будет использоваться трехкратное расслоение.
Вложенная перекрестная проверка
Два цикла перекрестной проверки выполняются параллельно: один проходитGridSearchCV
настраиватьзначение, другое черезcross_val_scroe
Измерьте производительность предсказания предиктора. Полученная оценка будет объективной оценкой новых данных.
предупреждать:Объекты не могут быть вложены в параллельные вычисления (n_jobs
должно быть 1)
предиктор перекрестной проверки
Перекрестная проверка для установки параметров может быть основана на критерии «алгоритм определяет алгоритм». Вот почему для конкретных предикторов Scikit-learn предоставляетCross-validation: evaluating estimator performanceПредикторы, параметры которых автоматически генерируются перекрестной проверкой.
Имена этих предикторов аналогичны их базовым аналогам с добавлением «CV» после имени.
from sklearn import linear_model, datasets
lasso = linear_model.LassoCV()
diabetes = datasets.load_diabetes()
X_diabetes = diabetes.data
y_diabetes = diabetes.target
lasso.fit(X_diabetes, y_diabetes)
# 预测器自动选择了lambda
lasso.alpha_
from sklearn import linear_model, datasets
lasso = linear_model.LassoCV()
diabetes = datasets.load_diabetes()
X_diabetes = diabetes.data
y_diabetes = diabetes.target
lasso.fit(X_diabetes, y_diabetes)
# 预测器自动选择了lambda
lasso.alpha_
lasso.alpha_ > 0
使用LassoCV线性模型,对糖尿病数据集做拟合,输出自动选择的lambda参数。
Упражнение
Поиск лучших параметров регуляризации на основе наборов данных о диабетеalpha
.
В наборе данных по диабету найдите оптимальный параметр регуляризации альфа.
Бонус: насколько можно доверять выбору альфы?
Расширенный вопрос: Насколько уверен выбор альфы?
%matplotlib inline
import numpy as np
from sklearn import datasets
from sklearn.linear_model import LassoCV
from sklearn.linear_model import Lasso
from sklearn.cross_validation import KFold
from sklearn.cross_validation import cross_val_score
diabetes = datasets.load_diabetes()
# 以下由读者完成全部程序
X = diabetes.data[:150]
y = diabetes.target[:150]
lasso = Lasso(random_state=0)
alphas = np.logspace(-4, -0.5, 30)
scores = list()
scores_std = list()
n_folds = 3
for alpha in alphas:
lasso.alpha = alpha
this_scores = cross_val_score(lasso, X, y, cv=n_folds, n_jobs=1)
scores.append(np.mean(this_scores))
scores_std.append(np.std(this_scores))
scores, scores_std = np.array(scores), np.array(scores_std)
plt.figure().set_size_inches(8, 6)
plt.semilogx(alphas, scores)
# plot error lines showing +/- std. errors of the scores
std_error = scores_std / np.sqrt(n_folds)
plt.semilogx(alphas, scores + std_error, 'b--')
plt.semilogx(alphas, scores - std_error, 'b--')
# alpha=0.2 controls the translucency of the fill color
plt.fill_between(alphas, scores + std_error, scores - std_error, alpha=0.2)
plt.ylabel('CV score +/- std error')
plt.xlabel('alpha')
plt.axhline(np.max(scores), linestyle='--', color='.5')
plt.xlim([alphas[0], alphas[-1]])
np.mean(scores) > 0.3
首先生成alpha的样本空间,再对alpha进行迭代并绘制对应score图象。