- 利用构建算法过程中的分类规则;
- 以决策树为例:决策树分类节点表示局部最优化的显著特征值,每个节点下的特征变量以及对应的值的组合构成规则。
- 从大量的输入变量中获得重要性特征,然后提取权重最高的几个特征。
- 缺失值是分类变量,基于模型法填补缺失值;
- 基于已有其他字段,将缺失字段作为目标变量进行预测。
- 文本分类时用到最多的是朴素贝叶斯。
- 训练集比较小,那么选择高偏差且低方差的分类算法效果逢高,如朴素贝叶斯、支持向量机、这些算法不容易过拟合。
- 训练集比较大,选取何种方法都不会显著影响准确度。
- 省时好操作选着用支持向量机,不要使用神经网络。
- 重视算法准确度,那么选择算法精度高的算法,例如支持向量机、随机森林。
- 想得到有关预测结果的概率信息,使用逻辑回归。
- 需要清洗的决策规则,使用决策树。
本次分类分析使用股市数据。此处可参考金融数据准备。
KNNK-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):
# 模型训练和预测
neigh = KNeighborsClassifier(n_neighbors = n).fit(X_train,y_train)
yhat=neigh.predict(X_test)
mean_acc[n-1] = metrics.accuracy_score(y_test, yhat)
std_acc[n-1]=np.std(yhat==y_test)/np.sqrt(yhat.shape[0])
# 绘图
plt.figure(figsize=(12,6))
plt.plot(range(1,Ks),mean_acc,'g')
plt.fill_between(range(1,Ks),mean_acc - 1 * std_acc,mean_acc 1 * std_acc, alpha=0.10)
plt.legend(('Accuracy ', ' /- 3xstd'))
plt.ylabel('Accuracy ')
plt.xlabel('Number of Nabors (K)')
plt.tight_layout()
plt.show()
# print( "The best accuracy was with",
mean_acc.max(), "with k=",
mean_acc.argmax() 1)