[Scikit-learn Tutorial] 02.03 Выбор модели: предикторы и их параметры

искусственный интеллект Python scikit-learn
[Scikit-learn Tutorial] 02.03 Выбор модели: предикторы и их параметры

Добро пожаловать на главный сайт 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настраиватьgammaзначение, другое через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图象。

参考输出结果




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

Поддразнивание мошенников электронной почты с помощью PaddlePaddle (конец)

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

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