使用线性 SVC 进行图像分类
image classification using linear SVC
我正在尝试了解线性 SVC 在 SVM 中的工作原理,并为此尝试通过使用不同参数进行训练和测试来复制一个简单的实验。问题是我似乎无法理解我究竟如何使用我的数据来训练和测试线性 SVC 算法。基本上,我想做的是使用线性 SVC 进行图像识别。
我有来自 5 个不同人的 5 个帧,每个图像有 22 个特征。我的目标是简单地获得图像的训练率,我的问题是我获得了 100% 的训练率,当我期望大约 80% 左右时,我想知道我怎样才能达到适当的识别率,那么?
import sklearn
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn import metrics
dataset = np.asarray(data)
target = np.asarray([1]*5 + [2]*5 + [3]*5 + [4]*5 + [5]*5)
svc_1 = SVC(kernel='linear')
X_train, X_test, y_train, y_test = train_test_split(
dataset, target, test_size=0.35, random_state=0)
def train_and_evaluate(clf, X_train, X_test, y_train, y_test):
clf.fit(X_train, y_train)
print ("Accuracy on training set:")
print (clf.score(X_train, y_train))
print ("Accuracy on testing set:")
print (clf.score(X_test, y_test))
y_pred = clf.predict(X_test)
print ("Classification Report:")
print (metrics.classification_report(y_test, y_pred))
print ("Confusion Matrix:")
print (metrics.confusion_matrix(y_test, y_pred))
train_and_evaluate(svc_1, X_train, X_test, y_train, y_test)
这是我的代码,为了保存可视化,我将我的 25x22 矩阵上传到 pastebin:https://pastebin.com/6hL6Dign
这是我的输出:
Accuracy on training set:
1.0
Accuracy on testing set:
1.0
Classification Report:
precision recall f1-score support
1 1.00 1.00 1.00 1
2 1.00 1.00 1.00 1
3 1.00 1.00 1.00 1
4 1.00 1.00 1.00 3
5 1.00 1.00 1.00 3
accuracy 1.00 9
macro avg 1.00 1.00 1.00 9
weighted avg 1.00 1.00 1.00 9
简而言之,我想做的是降低数据集中的行数 or/and 列数,但我一直得到 100%
问题是 - 您的数据集在 5 类 之间确实很好地分开了。
线索 #1 - 目标改组
打乱目标导致准确度下降。尝试在目标定义后添加:
random.shuffle(target) # Requires `import shuffle`
线索 #2 - PCA
我使用 principal component analysis (PCA) 通过减少两个特征来可视化您的数据:
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
pca = PCA(n_components=2)
pca_res = pca.fit_transform(data)
plt.scatter(pca_res[:, 0], pca_res[:, 1], color=list(map(' rgbyc'.__getitem__, target)))
结果:
很明显 类 分离得很好 - in-group 方差比 between-group 方差小得多。显然,即使样本量这么小,SVC 也可以毫无问题地检测出正确的 类 测试集。
编辑
看来甚至不需要 PCA。单个特征(例如第二个特征)产生 100% 的分离。试试你的代码:
dataset = np.asarray(data)[:, 1:2]
以及可视化:
import seaborn as sns
sns.boxplot(x=target, y=dataset[:, 1]) # Original dataset used here
结果:
我正在尝试了解线性 SVC 在 SVM 中的工作原理,并为此尝试通过使用不同参数进行训练和测试来复制一个简单的实验。问题是我似乎无法理解我究竟如何使用我的数据来训练和测试线性 SVC 算法。基本上,我想做的是使用线性 SVC 进行图像识别。
我有来自 5 个不同人的 5 个帧,每个图像有 22 个特征。我的目标是简单地获得图像的训练率,我的问题是我获得了 100% 的训练率,当我期望大约 80% 左右时,我想知道我怎样才能达到适当的识别率,那么?
import sklearn
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn import metrics
dataset = np.asarray(data)
target = np.asarray([1]*5 + [2]*5 + [3]*5 + [4]*5 + [5]*5)
svc_1 = SVC(kernel='linear')
X_train, X_test, y_train, y_test = train_test_split(
dataset, target, test_size=0.35, random_state=0)
def train_and_evaluate(clf, X_train, X_test, y_train, y_test):
clf.fit(X_train, y_train)
print ("Accuracy on training set:")
print (clf.score(X_train, y_train))
print ("Accuracy on testing set:")
print (clf.score(X_test, y_test))
y_pred = clf.predict(X_test)
print ("Classification Report:")
print (metrics.classification_report(y_test, y_pred))
print ("Confusion Matrix:")
print (metrics.confusion_matrix(y_test, y_pred))
train_and_evaluate(svc_1, X_train, X_test, y_train, y_test)
这是我的代码,为了保存可视化,我将我的 25x22 矩阵上传到 pastebin:https://pastebin.com/6hL6Dign
这是我的输出:
Accuracy on training set:
1.0
Accuracy on testing set:
1.0
Classification Report:
precision recall f1-score support
1 1.00 1.00 1.00 1
2 1.00 1.00 1.00 1
3 1.00 1.00 1.00 1
4 1.00 1.00 1.00 3
5 1.00 1.00 1.00 3
accuracy 1.00 9
macro avg 1.00 1.00 1.00 9
weighted avg 1.00 1.00 1.00 9
简而言之,我想做的是降低数据集中的行数 or/and 列数,但我一直得到 100%
问题是 - 您的数据集在 5 类 之间确实很好地分开了。
线索 #1 - 目标改组
打乱目标导致准确度下降。尝试在目标定义后添加:
random.shuffle(target) # Requires `import shuffle`
线索 #2 - PCA
我使用 principal component analysis (PCA) 通过减少两个特征来可视化您的数据:
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
pca = PCA(n_components=2)
pca_res = pca.fit_transform(data)
plt.scatter(pca_res[:, 0], pca_res[:, 1], color=list(map(' rgbyc'.__getitem__, target)))
结果:
很明显 类 分离得很好 - in-group 方差比 between-group 方差小得多。显然,即使样本量这么小,SVC 也可以毫无问题地检测出正确的 类 测试集。
编辑
看来甚至不需要 PCA。单个特征(例如第二个特征)产生 100% 的分离。试试你的代码:
dataset = np.asarray(data)[:, 1:2]
以及可视化:
import seaborn as sns
sns.boxplot(x=target, y=dataset[:, 1]) # Original dataset used here
结果: