Deeplearning Algorithms tutorial

谷歌的人工智能位于全球前列,在图像识别、语音识别、无人驾驶等技术上都已经落地。而百度实质意义上扛起了国内的人工智能的大旗,覆盖无人驾驶、智能助手、图像识别等许多层面。苹果业已开始全面拥抱机器学习,新产品进军家庭智能音箱并打造工作站级别Mac。另外,腾讯的深度学习平台Mariana已支持了微信语音识别的语音输入法、语音开放平台、长按语音消息转文本等产品,在微信图像识别中开始应用。全球前十大科技公司全部发力人工智能理论研究和应用的实现,虽然入门艰难,但是一旦入门,高手也就在你的不远处! AI的开发离不开算法那我们就接下来开始学习算法吧!

随机森林(Random Forest)

随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。 Leo Breiman和Adele Cutler发展出推论出随机森林的算法。而”Random Forests”是他们的商标。这个术语是1995年由贝尔实验室的Tin Kam Ho所提出的随机决策森林(random decision forests)而来的。这个方法则是结合Breimans的”Bootstrap aggregating”想法和Ho的”random subspace method” 以建造决策树的集合。

随机森林通过集成学习的思想将多棵树集成的一种算法,它的基本单元是决策树,而它的本质属于机器学习的一大分支——集成学习(Ensemble Learning)方法。随机森林的名称中有两个关键词,一个是“随机”,一个就是”森林”。”森林”我们很好理解,一棵叫做树,那么成百上千棵就可以叫做森林了,这样的比喻还是很贴切的,其实这也是随机森林的主要思想—集成思想的体现。其实从直观角度来解释,每棵决策树都是一个分类器(假设现在针对的是分类问题),那么对于一个输入样本,N棵树会有N个分类结果。而随机森林集成了所有的分类投票结果,将投票次数最多的类别指定为最终的输出,这就是一种最简单的 Bagging 思想。

随机森林(Random Forest) - 图1

随机森林是一种很灵活实用的方法,它有如下几个特点:

  • 在当前所有算法中,具有极好的准确率;
  • 能够有效地运行在大数据集上;
  • 能够处理具有高维特征的输入样本,而且不需要降维;
  • 能够评估各个特征在分类问题上的重要性;
  • 在生成过程中,能够获取到内部生成误差的一种无偏估计;
  • 对于缺省值问题也能够获得很好得结果;

应用案例

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from matplotlib.colors import ListedColormap
  4. from sklearn.cross_validation import train_test_split
  5. from sklearn.preprocessing import StandardScaler
  6. from sklearn.datasets import make_moons, make_circles, make_classification
  7. from sklearn.neighbors import KNeighborsClassifier
  8. from sklearn.svm import SVC
  9. from sklearn.tree import DecisionTreeClassifier
  10. from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier
  11. from sklearn.naive_bayes import GaussianNB
  12. from sklearn.lda import LDA
  13. from sklearn.qda import QDA
  14. h = .02 # step size in the mesh
  15. names = ["Nearest Neighbors", "Linear SVM", "RBF SVM", "Decision Tree",
  16. "Random Forest", "AdaBoost", "Naive Bayes", "LDA", "QDA"]
  17. classifiers = [
  18. KNeighborsClassifier(3),
  19. SVC(kernel="linear", C=0.025),
  20. SVC(gamma=2, C=1),
  21. DecisionTreeClassifier(max_depth=5),
  22. RandomForestClassifier(max_depth=5, n_estimators=10, max_features=1),
  23. AdaBoostClassifier(),
  24. GaussianNB(),
  25. LDA(),
  26. QDA()]
  27. X, y = make_classification(n_features=2, n_redundant=0, n_informative=2,
  28. random_state=1, n_clusters_per_class=1)
  29. rng = np.random.RandomState(2)
  30. X += 2 * rng.uniform(size=X.shape)
  31. linearly_separable = (X, y)
  32. datasets = [make_moons(noise=0.3, random_state=0),
  33. make_circles(noise=0.2, factor=0.5, random_state=1),
  34. linearly_separable
  35. ]
  36. figure = plt.figure(figsize=(27, 9))
  37. i = 1
  38. # iterate over datasets
  39. for ds in datasets:
  40. # preprocess dataset, split into training and test part
  41. X, y = ds
  42. X = StandardScaler().fit_transform(X)
  43. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.4)
  44. x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
  45. y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5
  46. xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
  47. np.arange(y_min, y_max, h))
  48. # just plot the dataset first
  49. cm = plt.cm.RdBu
  50. cm_bright = ListedColormap(['#FF0000', '#0000FF'])
  51. ax = plt.subplot(len(datasets), len(classifiers) + 1, i)
  52. # Plot the training points
  53. ax.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=cm_bright)
  54. # and testing points
  55. ax.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=cm_bright, alpha=0.6)
  56. ax.set_xlim(xx.min(), xx.max())
  57. ax.set_ylim(yy.min(), yy.max())
  58. ax.set_xticks(())
  59. ax.set_yticks(())
  60. i += 1
  61. # iterate over classifiers
  62. for name, clf in zip(names, classifiers):
  63. ax = plt.subplot(len(datasets), len(classifiers) + 1, i)
  64. clf.fit(X_train, y_train)
  65. score = clf.score(X_test, y_test)
  66. # Plot the decision boundary. For that, we will assign a color to each
  67. # point in the mesh [x_min, m_max]x[y_min, y_max].
  68. if hasattr(clf, "decision_function"):
  69. Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
  70. else:
  71. Z = clf.predict_proba(np.c_[xx.ravel(), yy.ravel()])[:, 1]
  72. # Put the result into a color plot
  73. Z = Z.reshape(xx.shape)
  74. ax.contourf(xx, yy, Z, cmap=cm, alpha=.8)
  75. # Plot also the training points
  76. ax.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=cm_bright)
  77. # and testing points
  78. ax.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=cm_bright,
  79. alpha=0.6)
  80. ax.set_xlim(xx.min(), xx.max())
  81. ax.set_ylim(yy.min(), yy.max())
  82. ax.set_xticks(())
  83. ax.set_yticks(())
  84. ax.set_title(name)
  85. ax.text(xx.max() - .3, yy.min() + .3, ('%.2f' % score).lstrip('0'),
  86. size=15, horizontalalignment='right')
  87. i += 1
  88. figure.subplots_adjust(left=.02, right=.98)
  89. plt.show()

优点

  • 随机森林对于很多种数据,它可以产生高准确度的分类器。
  • 随机森林可以处理大量的输入变量。
  • 随机森林可以在决定类别时,评估变量的重要性。
  • 在建造森林时,它可以在内部对于一般化后的误差产生不偏差的估计。
  • 随机森林包含一个好方法可以估计丢失的数据,并且,如果有很大一部分的数据丢失,仍可以维持准确度。
  • 它提供一个实验方法,可以去侦测variable interactions。
  • 对于不平衡的分类数据集来说,它可以平衡误差。
  • 它计算各例中的亲近度,对于数据挖掘、侦测离群点(outlier)和将数据可视化非常有用。
  • 它可被延伸应用在未标记的数据上,这类数据通常是使用非监督式聚类。也可侦测偏离者和观看数据。
  • 学习过程是很快速的。