机器学习1:scikit-learn简介(2)—— 预处理数据

预处理数据

  • scikit-learn的介绍
    • 一、机器学习的一般步骤
    • 二、预处理数据
      • 1. 标准化数据
      • 2. 错误的预处理模式
      • 3. 使用管道连接器Pipeline
      • 练习

scikit-learn的介绍

一、机器学习的一般步骤

链接:机器学习的一般步骤

二、预处理数据

1. 标准化数据

我们在训练模型之前可以先预处理数据,即标准化。为了观察这个过程必要性,我们将检查训练模型所需的 迭代次数。

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

通过归一化数据,模型的收敛速度要比未归一化的数据快得多。(迭代次数变少了)

2. 错误的预处理模式

预处理数据有 两个 潜在的易于犯的错误。

第一种错误模式是在整个数据集分成训练集和测试集之 前 就标准化数据。例如:

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

3. 使用管道连接器Pipeline

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

(完。)

你可能感兴趣的:(python机器学习与数据挖掘,机器学习,python)