链接:机器学习的一般步骤
我们在训练模型之前可以先预处理数据,即标准化。为了观察这个过程必要性,我们将检查训练模型所需的 迭代次数。
from sklearn.linear_model import LogisticRegression
clf=LogisticRegression(solver='lbfgs',multi_class='auto',max_iter=5000,random_state=42)
clf.fit(X_train,y_train)
print('{} required {} iterations to be fitted'.format(clf.__class__.__name__,clf.n_iter_[0]))
输出:
LogisticRegression required 2109 iterations to be fitted
# 需要2109次迭代才能完成
MinMaxScaler 函数 用于标准化数据,将数据归一到[0,1]中间。转换函数为:x = (x-min)/(max-min)
fit(): 求得训练集X的均值,方差,最大值,最小值,统计这些训练集X固有的属性。
transform(): 在 fit 的基础上,进行标准化,降维,归一化等转换操作。
fit_transform(): 是 fit 和 transform 的组合,既包括了统计又包含了转换。 使用方法:
1 通过 fit_transform 方法分析、转换训练集。
2 通过 transform 转换测试集。 从而保证训练集、测试集的处理方式相同。
from sklearn.preprocessing import MinMaxScaler
from sklearn.linear_model import LogisticRegression
scaler=MinMaxScaler()
X_train_scaled=scaler.fit_transform(X_train)
X_test_scaled=scaler.transform(X_test)
clf=LogisticRegression(solver='lbfgs',multi_class='auto',max_iter=1000,random_state=42)
clf.fit(X_train_scaled,y_train)
accuracy=clf.score(X_test_scaled,y_test)
print('Accuracy score of the {} is {:.2f}'.format(clf.__class__.__name__,accuracy))
print('{} required {} iterations to be fitted'.format(clf.__class__.__name__,clf.n_iter_[0]))
输出:
Accuracy score of the LogisticRegression is 0.94
LogisticRegression required 175 iterations to be fitted
通过归一化数据,模型的收敛速度要比未归一化的数据快得多。(迭代次数变少了)
预处理数据有 两个 潜在的易于犯的错误。
第一种错误模式是在整个数据集分成训练集和测试集之 前 就标准化数据。例如:
scaler = MinMaxScaler()
X=digits.data
y=digits.target
X_scaled = scaler.fit_transform(X)
X_train_prescaled, X_test_prescaled, y_train_prescaled, y_test_prescaled = train_test_split(
X_scaled, y, stratify=y, random_state=42)
clf = LogisticRegression(solver='lbfgs', multi_class='auto', max_iter=1000, random_state=42)
clf.fit(X_train_prescaled, y_train_prescaled)
accuracy = clf.score(X_test_prescaled, y_test_prescaled)
print('Accuracy score of the {} is {:.2f}'.format(clf.__class__.__name__, accuracy))
输出:
Accuracy score of the LogisticRegression is 0.96
第二种错误模式是分别标准化训练集和测试集。它训练集和测试集上调用fit_transform方法。因此,训练和测试集的 标准化不同。
scaler=MinMaxScaler()
X_train_prescaled=scaler.fit_transform(X_train)
X_test_prescaled=scaler.fit_transform(X_test)
clf=LogisticRegression(solver='lbfgs', multi_class='auto', max_iter=1000, random_state=42)
clf.fit(X_train_prescaled,y_train)
accuracy=clf.score(X_test_prescaled,y_test)
print('Accuracy score of the {} is {:.2f}'.format(clf.__class__.__name__,accuracy))
输出:
Accuracy score of the LogisticRegression is 0.94
scikit-learn引入了Pipeline对象。它依次连接多个 标准化器和分类器(或回归器)。我们可以创建一个如下管道:
from sklearn.pipeline import Pipeline
pipe=Pipeline(steps=[('scaler',MinMaxScaler()),
('clf',LogisticRegression(solver='lbfgs', multi_class='auto', random_state=42))])
我们看到这个管道包含了归一化和分类器的参数。 有时,为管道中的每个估计器命名可能会很繁琐。 而 make_pipeline 将自动为每个估计器命名。
from sklearn.pipeline import make_pipeline
pipe=make_pipeline(MinMaxScaler(),
LogisticRegression(solver='lbfgs', multi_class='auto', random_state=42, max_iter=1000))
管道将使用 fit 来训练分类器,socre来检查准确性。
pipe.fit(X_train,y_train)
accuracy=pipe.score(X_test,y_test)
print('Accuracy score of the {} is {:.2f}'.format(pipe.__class__.__name__,accuracy))
输出:
Accuracy score of the Pipeline is 0.94
我们可以使用 get_params() 检查管道的所有参数。
pipe.get_params()
输出:
{'memory': None,
'steps': [('scaler', MinMaxScaler(copy=True, feature_range=(0, 1))),
('clf',
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
intercept_scaling=1, max_iter=100, multi_class='auto',
n_jobs=None, penalty='l2', random_state=42, solver='lbfgs',
tol=0.0001, verbose=0, warm_start=False))],
'scaler': MinMaxScaler(copy=True, feature_range=(0, 1)),
'clf': LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
intercept_scaling=1, max_iter=100, multi_class='auto',
n_jobs=None, penalty='l2', random_state=42, solver='lbfgs',
tol=0.0001, verbose=0, warm_start=False),
'scaler__copy': True,
'scaler__feature_range': (0, 1),
'clf__C': 1.0,
'clf__class_weight': None,
'clf__dual': False,
'clf__fit_intercept': True,
'clf__intercept_scaling': 1,
'clf__max_iter': 100,
'clf__multi_class': 'auto',
'clf__n_jobs': None,
'clf__penalty': 'l2',
'clf__random_state': 42,
'clf__solver': 'lbfgs',
'clf__tol': 0.0001,
'clf__verbose': 0,
'clf__warm_start': False}
重用第一个练习的乳腺癌数据集来训练,可以从 linear_model 导入
SGDClassifier
分类器。从 sklearn.preprocessing 导入的StandardScaler
变换器来创建管道。然后训练和测试这条管道。
from sklearn.preprocessing import StandardScaler # 导入变换器(用于标准化数据)
from sklearn.linear_model import SGDClassifier # 导入分类器
from sklearn.pipeline import Pipeline
from sklearn.pipeline import make_pipeline
pipe=make_pipeline(StandardScaler(),SGDClassifier(max_iter=1000))
pipe.fit(X_train,y_train)
y_pred=pipe.predict(X_test)
accuracy=balanced_accuracy_score(y_test,y_pred)
print('Accuracy score of the {} is {:.2f}'.format(pipe.__class__.__name__,accuracy))
输出:
Accuracy score of the Pipeline is 0.95
(完。)