一、算法审查
对于当前数据集,寻找最优算法
没有最好的分类器,只有最合适的分类器。
随机森林平均来说最强,但也只在9.9%的数据集上拿到了第一,优点是鲜有短板。
SVM的平均水平紧随其后,在10.7%的数据集上拿到第一。
神经网络(13.2%)和boosting(~9%)表现不错。
数据维度越高,随机森林就比AdaBoost强越多,但是整体不及SVM[2]。### 数据量越大,神经网络就越强。
作者:xyzh
链接:https://www.zhihu.com/question/26726794/answer/151282052
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
二、线性算法
1.逻辑回归
1.1 原理 :函数找到最合适的参数,使得函数的值和样本的值最接近。
1.2 适用场景:虽然效果一般,却胜在模型清晰,背后的概率学经得住推敲
2.线性判别分析(LDA)
2.1 原理 :高维的样本投射(project)到低维上,LDA投射的标准就是让同类的样本尽量靠近,而不同类的尽量分开。
2.2 适用场景:判别分析适用于高维数据需要降维的情况,自带降维功能使得我们能方便地观察样本分布。(假定样本正态分布)
三、非线性算法
1.K近邻(KNN)
1.1 原理 :对于待判断的点,找到离它最近的几个数据点,根据它们的类型决定待判断点的类型。
1.2 适用场景:需要一个特别容易解释的模型的时候,比如需要向用户解释原因的推荐算法。
2.贝叶斯分类器
2.1 原理 :核心思路是根据条件概率计算待判断点的类型。
2.2 适用场景:需要一个比较容易解释,而且不同维度之间相关性较小的模型的时候。
3.分类与回归树(CART)
3.1 原理 :给定输入随机变量X条件下,输出随机变量Y的条件概率分布的学习方法
4.支持向量机(SVM)
4.1 原理 :找到不同类别之间的分界面,使得两类样本尽量落在面的两边,而且离分界面尽量远。
4.2 适用场景:普遍适用
5.随机森林
5.1 原理 :它首先随机选取不同的特征和训练样本,生成大量的决策树,然后综合这些决策树的结果来进行最终的分类。
5.2 适用场景:数据维度相对低(几十维),同时对准确性有较高要求时。
6.神经网络
6.1 原理 :利用训练样本(training sample)来逐渐地完善参数。
6.2 适用场景:数据量庞大,参数之间存在内在联系的时候。
四、测试
In [28]:
from pandas import read_csv
import pandas as pd
from sklearn.model_selection import KFold
from sklearn.linear_model import LogisticRegression
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestClassifier
from matplotlib import pyplot
from sklearn.preprocessing import LabelEncoder
# 导入数据
iris =pd.read_csv('http://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data',header=None)
iris.columns=['SepalLengthCm','SepalWidthCm','PetalLengthCm','PetalWidthCm','Species']
# 将数据分为输入数据和输出结果
arrary = iris.values
# print(arrary)
X =arrary[:,0:4]
le = LabelEncoder()
le.fit(iris['Species'])
Y = le.transform(iris['Species']) # 对花的类别进行编号处理
num_folds = 10
seed = 7
kfold = KFold(n_splits=num_folds, random_state=seed)
models = {}
# 逻辑回归
models['LR'] = LogisticRegression()
# 线性判别分析
models['LDA'] = LinearDiscriminantAnalysis()
# K近邻
models['KNN'] = KNeighborsClassifier()
# 分类与回归树
models['CART'] = DecisionTreeClassifier()
# 支持向量机
models['SVM'] = SVC()
# 随机森林
models['RF'] = RandomForestClassifier(10)
# 朴素贝叶斯分类器
models['NB'] = GaussianNB()
results = []
for name in models:
result = cross_val_score(models[name], X, Y, cv=kfold)
results.append(result)
msg = '%s: %.3f (%.3f)' % (name, result.mean(), result.std())
print(msg)
# 图表显示
fig = pyplot.figure()
fig.suptitle('Algorithm Comparison')
ax = fig.add_subplot(111)
pyplot.boxplot(results)
ax.set_xticklabels(models.keys())
pyplot.show()
KNN: 0.933 (0.084)
LDA: 0.967 (0.061)
SVM: 0.953 (0.052)
NB: 0.947 (0.058)
CART: 0.933 (0.084)
RF: 0.947 (0.072)
LR: 0.880 (0.148)