读: 在机器学习和统计中,分类算法通过对已知类别训练集的计算和分析,从中发现类别规则并预测新数据的类别。分类被认为是监督学习的一个实例,即学习可以获得正确识别的观察的训练集的情况。
实现分类的算法,特别是在具体实现中,被称为分类器。本文将从实际应用案例出发,总结性介绍几种常用的单模型分类器。原理和代码均在文中,内容较长,建议收藏,后面需要用到时方便查看。
获取更多资源,关注VX公中号:python语言空间
一般应用
分类分析用于提炼应用规则
-
利用构建算法过程中的分类规则;
-
以决策树为例:决策树分类节点表示局部最优化的显著特征值,每个节点下的特征变量以及对应的值的组合构成规则。
分类用于提取特征
-
从大量的输入变量中获得重要性特征,然后提取权重最高的几个特征。
分类用于处理缺失值
-
缺失值是分类变量,基于模型法填补缺失值;
-
基于已有其他字段,将缺失字段作为目标变量进行预测。
分类分析算法的选取
-
文本分类时用到最多的是朴素贝叶斯。
-
训练集比较小,那么选择高偏差且低方差的分类算法效果逢高,如朴素贝叶斯、支持向量机、这些算法不容易过拟合。
-
训练集比较大,选取何种方法都不会显著影响准确度。
-
省时好操作选着用支持向量机,不要使用神经网络。
-
重视算法准确度,那么选择算法精度高的算法,例如支持向量机、随机森林。
-
想得到有关预测结果的概率信息,使用逻辑回归。
-
需要清洗的决策规则,使用决策树。
数据准备
本次分类分析使用股市数据。此处可参考金融数据准备。
KNN
K-Nearest Neighbors (KNN) 是一种懒惰学习算法和分类算法。此外,KNN是机器学习中最简单的方法。利用KNN进行分类,预测新点的分类。
数据预处理
从数据集dataset
中选取需要用的数据作为输入数据和标签。
X = dataset.loc[ : , ['high','low','close']].values
y = dataset.loc[ : , ['Up_Down']].values
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20)
数据标准化
数据标准化对于距离类模型,数据归一化是非常有必要的。这里使用sklearn.preprocessing
中StandardScaler
。
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(X_train)
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)
模型训练与预测
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train)
y_pred = knn.predict(X_test)
模型评价
from sklearn.metrics import classification_report, confusion_matrix
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))
[[39 31]
[32 44]]
precision recall f1-score support
-1 0.55 0.56 0.55 70
1 0.59 0.58 0.58 76
accuracy 0.57 146
macro avg 0.57 0.57 0.57 146
weighted avg 0.57 0.57 0.57 146
绘制学习曲线
分类以KNeighbors个数为x轴,模型得分为y轴,绘制学习曲线,以模型得分最高的n_neighbors为本次模型最终参数。
from sklearn.metrics import accuracy_score
score = []
for K in range(40):
K_value = K+1
knn = KNeighborsClassifier(n_neighbors = K_value, weights='uniform', algorithm='auto')
knn.fit(X_train, y_train)
y_pred = knn.predict(X_test)
score.append(round(accuracy_score(y_test,y_pred)*100,2))
plt.figure(figsize=(12, 6))
plt.plot(range(1, 41), score, color='red', linestyle='dashed', marker='o',
markerfacecolor='blue', markersize=10)
plt.title('The Learning curve')
plt.xlabel('K Value')
plt.ylabel('Score')
带误差线的学习曲线
from sklearn import metrics
Ks = 10
mean_acc = np.zeros((Ks-1))
std_acc = np.zeros((Ks-1))
ConfustionMx = [];
for n in range(1,Ks):
# 模