Python 计算训练集的混淆矩阵
我是机器学习的新手。最近,我学会了如何为Python 计算训练集的混淆矩阵,python,machine-learning,cross-validation,knn,Python,Machine Learning,Cross Validation,Knn,我是机器学习的新手。最近,我学会了如何为KNN分类的测试集计算混淆矩阵。但是我不知道,对于KNN分类的训练集,如何计算混淆矩阵 如何从以下代码计算KNN分类的训练集的混淆矩阵 以下代码用于计算测试集的混淆矩阵: # Split test and train data import numpy as np from sklearn.model_selection import train_test_split X = np.array(dataset.ix[:, 1:10]) y = np.arr
KNN分类的测试集计算混淆矩阵。但是我不知道,对于KNN分类的训练集
,如何计算混淆矩阵
如何从以下代码计算KNN分类的训练集的混淆矩阵
以下代码用于计算测试集的混淆矩阵:
# Split test and train data
import numpy as np
from sklearn.model_selection import train_test_split
X = np.array(dataset.ix[:, 1:10])
y = np.array(dataset['benign_malignant'])
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
#Define Classifier
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors = 5, metric = 'minkowski', p = 2)
knn.fit(X_train, y_train)
# Predicting the Test set results
y_pred = knn.predict(X_test)
# Making the Confusion Matrix
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred) # Calulate Confusion matrix for test set.
对于k-折叠交叉验证:
我还尝试使用k-fold交叉验证为训练集查找混淆矩阵
我对这一行感到困惑knn.fit(X\u-train,y\u-train)
我是否将更改此行knn.fit(X\U列车,y\U列车)
对于训练集
的计算混淆矩阵
,我应该在哪里更改以下代码
# Applying k-fold Method
from sklearn.cross_validation import StratifiedKFold
kfold = 10 # no. of folds (better to have this at the start of the code)
skf = StratifiedKFold(y, kfold, random_state = 0)
# Stratified KFold: This first divides the data into k folds. Then it also makes sure that the distribution of the data in each fold follows the original input distribution
# Note: in future versions of scikit.learn, this module will be fused with kfold
skfind = [None]*len(skf) # indices
cnt=0
for train_index in skf:
skfind[cnt] = train_index
cnt = cnt + 1
# skfind[i][0] -> train indices, skfind[i][1] -> test indices
# Supervised Classification with k-fold Cross Validation
from sklearn.metrics import confusion_matrix
from sklearn.neighbors import KNeighborsClassifier
conf_mat = np.zeros((2,2)) # Initializing the Confusion Matrix
n_neighbors = 1; # better to have this at the start of the code
# 10-fold Cross Validation
for i in range(kfold):
train_indices = skfind[i][0]
test_indices = skfind[i][1]
clf = []
clf = KNeighborsClassifier(n_neighbors = 5, metric = 'minkowski', p = 2)
X_train = X[train_indices]
y_train = y[train_indices]
X_test = X[test_indices]
y_test = y[test_indices]
# fit Training set
clf.fit(X_train,y_train)
# predict Test data
y_predcit_test = []
y_predict_test = clf.predict(X_test) # output is labels and not indices
# Compute confusion matrix
cm = []
cm = confusion_matrix(y_test,y_predict_test)
print(cm)
# conf_mat = conf_mat + cm
你不必做太多的改变
# Predicting the train set results
y_train_pred = knn.predict(X_train)
cm_train = confusion_matrix(y_train, y_train_pred)
在这里,我们不使用X_测试
而是使用X_训练
进行分类,然后使用训练数据集的预测类和实际类生成分类矩阵
分类矩阵背后的思想本质上是找出分为四类的分类数(如果y
是二进制的)——
预测正确但实际错误
预测真实与实际真实
预言是假的,但实际上是真的
预测错误和实际错误
因此,只要有两个集合——预测和实际,就可以创建混淆矩阵。您所要做的就是预测类,并使用实际的类来获得混淆矩阵
编辑
在交叉验证部分,您可以添加一行y\u predict\u train=clf.predict(X\u train)
,以计算每次迭代的混淆矩阵。您可以这样做,因为在循环中,每次都初始化clf
,这基本上意味着重置模型
此外,在代码中,您每次都会找到混淆矩阵,但不会将其存储在任何地方。提示:如果你知道如何计算f(a)
,你就知道如何计算f(b)
:只需在函数调用中将a
替换为b
。knn.fit(X\u train,y\u train)
。我是否要换这条线@JulienIt取决于你想做什么。如果只想查看当前模型的结果(根据培训数据进行培训),则不想重新安装模型。如果你想要某种形式的交叉验证(从你的问题的声音来看,我对此表示怀疑),那么你也需要相应地进行更改。请参阅我编辑的问题@Julien。这不一定是真的。在k倍交叉验证中(此处为2倍),您正是这样做的。您可以切换测试和训练集并累积预测,以获得累积混淆矩阵。在ML中,我们通常不预测训练数据。但我们通常进行交叉验证。你想扩展你的答案吗?我已经编辑了我的答案。但我想知道,使用这句台词让你困惑的是什么?你到底在想什么?你为什么对那句台词感到不舒服?如果需要,我们可以在聊天中讨论。这可能不是最优雅的方法,但技术上很好。该行保持不变,因为在循环中,每次分配给X_train
,“X_test”等时,您都会重新初始化clf
,并创建KNeighborsClassifier
的新实例。无需再次调用fit
方法,因为在机器学习中,我们根据训练数据拟合模型,并根据测试数据进行预测。这样做是为了测试模型的拟合优度。我们这样做是因为我们想知道我们的模型是否擅长预测训练数据或测试数据。简单地说,假设从你的房子到市场的方向是三左一右。假设这是你的模型。三左一右的模型非常适合你的情况。它也是你邻居的好榜样等等。但这并不意味着它将是三个街区之外的房子的好样板。所以,这就是为什么我们在一个特定的集合上训练模型,并检查它是否能够推广它的学习,以预测它以前从未见过的其他情况