现在tensorflow很火,是否还有必要学习scikit-learn框架?

首先我们看sklearn和TensorFlow的区别。 这个问题其实等价于:现在深度学习那么火,那么是否还有必要学习传统的机器学习方法。

  理论上来说,深度学习技术也是机器学习的一个组成部分,学习其他传统的机器学习方法对深入理解深度学习技术有很大的帮助,知道模型凸的条件,才能更好的理解神经网络的非凸,知道传统模型的优点,才能更好的理解深度学习并不是万能的,也有很多问题和场景直接使用深度学习方法会遇到瓶颈和问题,需要传统方法来解决。

  从实践上来说,深度学习方法一般需要大量的GPU机器,工业界哪怕大公司的GPU资源也是有限的,一般只有深度学习方法效果远好于传统方法并且对业务提升很大的情况下,才会考虑使用深度学习方法,例如语音识别,图像识别等任务现在深度学习方法用的比较多,而NPL领域除了机器翻译以外,其他大部分任务仍然更常使用传统方法,传统方法一般有着更好的可解释性,这对检查调试模型也是非常有帮助的。工业上一般喜欢招能解决问题的人,而不是掌握最火技术的人,因此在了解深度学习技术的同时,学习一下传统的方法是很有好处的。

1.1 Sklearn和TensorFlow的区别

  Scikit-learn(Sklearn)的定位是通过机器学习库,而TensorFlow(tf)的定位主要是深度学习库。一个显而易见的不同:tf并未提供sklearn那种强大的特征工程,如维度压缩,特征选择等。

  传统机器学习:利用特征工程(feature enginerring),人为对数据进行提炼清洗

  深度学习:利用表示学习(representation learning),机器学习模型自身对数据进行提炼

  sklearn更倾向于使用者可以自行对数据进行处理,比如选择特征,压缩维度,转换格式,是传统机器学库,而以tf为代表的深度学习库会自动从数据中抽取有效特征,而不需要人为的来做这件事情,因此并未提供类似的功能。

现在tensorflow很火,是否还有必要学习scikit-learn框架?

  上面这幅图直观的对比了我们提到的两种对于数据的学习方法,传统的机器学习方法主要依赖人工特征处理与提取,而深度学习依赖模型自身去学习数据的表示。

1.2 模型封装的抽象化程度不同,给予使用者自由度不同

  sklearn中的模块都是高度抽象化,所有的分类器基本都可以在3~5行内完成,所有的转换器(如scaler和transformer)也有固定的格式,这种抽象化限制了使用者的自由度,但是增加了模型的效率,降低了批量化,标准化的难度。

  比如svm分类器:

clf = svm.SVC() # 初始化一个分类器

clf.fit(X_train, y_train) # 训练分类器

y_predict = clf.predict(X_test) # 使用训练好的分类器进行预测

  而tf不同,虽然是深度学习库,但是它由很高的自由度。你依然可以使用它做传统机器学习所做的事情,代码是你需要自己实现算法。因此用tf类比sklearn不适合,封装在tf等工具库的Keras更像深度学习界的sklearn。

  从自由度来看,tf更高;而从抽象化,封装程度来看,sklearn更高;从易用性角度来看,sklearn更高。

1.3 深度的群体,项目不同

  sklearn主要适合中小型的,实用机器学习项目,尤其是那种数据量不大且需要使用者手动对数据进行处理,并选择合适模型的项目,这类项目往往在CPU上就可以完成,对硬件要求低。

  tf主要适合已经明确了解需要用深度学习,且数据处理需求不高的项目。这类项目往往数据量较大,且最终需要的精度更高,一般都需要GPU加速运算。对于深度学习做“小样”可以在采样的小数据集上用Keras做快速的实验。

  下面我们看一个使用Keras搭建的网络,代码如下:

model = Sequential() # 定义模型

model.add(Dense(units=64, activation='relu', input_dim=100)) # 定义网络结构

model.add(Dense(units=10, activation='softmax')) # 定义网络结构

model.compile(loss='categorical_crossentropy', # 定义loss函数、优化方法、评估标准

optimizer='sgd',

metrics=['accuracy'])

model.fit(x_train, y_train, epochs=5, batch_size=32) # 训练模型

loss_and_metrics = model.evaluate(x_test, y_test, batch_size=128) # 评估模型

classes = model.predict(x_test, batch_size=128) # 使用训练好的数据进行预测

  不难看出,sklearn和tf还是有很大的区别,虽然sklearn中也有神经网络模块,但是做大型的深度学习是不可能依靠sklearn的。

1.4 sklearn和TensorFlow结合使用

  更常见的情况,可以把sklearn和tf,甚至Keras结合起来使用。sklearn肩负基本的数据清理任务,Keras用于对问题进行小规模试验验证想法,而tf用于在完整的数据上进行严肃的调参任务。

  而单独把sklearn拿出来看的话,它的文档做的特别好,初学者跟着看一遍sklearn支持的功能就可以大概对机器学习包括的很多内容有了基本的了解。举个简单的例子,sklearn很多时候对单独的知识点有概述,比如简单的异常检测。因此,sklearn不仅仅是简单的工具库,它的文档更像是一份简单的新手入门指南。

  因此,以sklearn为代表的传统机器学习库和以tf为代表的自由灵活更具有针对性的深度学习库都是机器学习者必须要了解的工具。

  那么如何结合sklearn库和Keras模型做机器学习任务呢?

  Keras是Python中比较流行的深度学习库,但是Keras本身关注的是深度学习。而Python中的scikit-learn库是建立在Scipy上的,有着比较有效的数值计算能力。Sklearn是一个具有全特征的通用性机器学习库,它提供了很多在深度学习中可以用到的工具,举个例子:

  • 1,可以用sklearn中的 K-fold 交叉验证方法来对模型进行评估
  • 2,模型参数的评估和寻找

 Keras提供了深度学习模型的简便包装,可以在Sklearn中被用来做分类和回归,在本文中我们举这么一个例子:使用Keras建立神经网络分类器——KerasClassifier,并在scikit-learn库中使用这个分类器对UCI的Pima Indians数据集进行分类。

  利用Keras进行分类或者回归,主要利用Keras中两个类,一个是KerasClassifier,另一个是KerasRegressor。这两个类有参数build_fn。build_fn是你创建的Keras名称,在创建一个Keras模型时,务必要把完成模型的定义,编译和返回。在这里我们假设建立的模型叫做create_model(),则:


def create_model():

# create model

model = Sequential()

model.add(Dense(12, input_dim=8, init='uniform', activation='relu'))

model.add(Dense(8, init='uniform', activation='relu'))

model.add(Dense(1, init='uniform', activation='sigmoid'))

# Compile model

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

return model

  将建立好的模型通过参数build_fn传递到KerasClassifier中,并且定义其他的参数选项nb_epoch = 150,batch_size = 10 。KerasClassifier会自动调用fit方法。

  在Sklearn中,我们使用它cross_validation的包中的StratifiedKFold来进行10折交叉验证,使用cross_val_score来对模型进行评价。


kfold = StratifiedKFold(y=Y, n_folds=10, shuffle=True, random_state=seed)

results = cross_val_score(model, X, Y, cv=kfold)

  总结来说,机器学习和深度学习均需要学习,只会调用工具包的程序员不是好的机器学习者。

  扯了这么多,我们明白sklearn和keras结合使用,相得益彰。


分享到:


相關文章: