如何 select 特征尺寸
How to select feature sizes
我正在尝试使用 SVM 在论文上复制实验,以增加我在机器学习方面的 learning/knownledge。在本文中,作者提取特征并选择特征大小。他,然后显示一个table 其中F代表特征向量的大小,N代表人脸图像
然后他使用 F >= 9 和 N >= 15 个参数。
现在,我想做的是像他在论文中所做的那样,真正抓住我提取的特征。
基本上,这就是我提取特征的方式:
def load_image_files(fullpath, dimension=(64, 64)):
descr = "A image classification dataset"
images = []
flat_data = []
target = []
dimension=(64, 64)
for category in CATEGORIES:
path = os.path.join(DATADIR, category)
for person in os.listdir(path):
personfolder = os.path.join(path, person)
for imgname in os.listdir(personfolder):
class_num = CATEGORIES.index(category)
fullpath = os.path.join(personfolder, imgname)
img_resized = resize(skimage.io.imread(fullpath), dimension, anti_aliasing=True, mode='reflect')
flat_data.append(img_resized.flatten())
images.append(skimage.io.imread(fullpath))
target.append(class_num)
flat_data = np.array(flat_data)
target = np.array(target)
images = np.array(images)
print(CATEGORIES)
return Bunch(data=flat_data,
target=target,
target_names=category,
images=images,
DESCR=descr)
如何 select 提取和存储的特征量?或者我如何手动存储具有我需要的特征量的向量?例如一个大小为 9
的特征向量
我正在尝试以这种方式分离我的特征:
X_train, X_test, y_train, y_test = train_test_split(
image_dataset.data, image_dataset.target, test_size=0.3,random_state=109)
model = ExtraTreesClassifier(n_estimators=10)
model.fit(X_train, y_train)
print(model.feature_importances_)
不过,我的输出是:
[0. 0. 0. ... 0. 0. 0.]
对于 SVM 分类,我正在尝试使用 OneVsRestClassifier
model_to_set = OneVsRestClassifier(SVC(kernel="poly"))
parameters = {
"estimator__C": [1,2,4,8],
"estimator__kernel": ["poly", "rbf"],
"estimator__degree":[1, 2, 3, 4],
}
model_tunning = GridSearchCV(model_to_set, param_grid=parameters)
model_tunning
model_tunning.fit(X_train, y_train)
prediction = model_tunning.best_estimator_.predict(X_test)
然后,调用预测后,我得到:
Out[29]:
array([1, 0, 4, 2, 1, 3, 3, 0, 1, 1, 3, 4, 1, 1, 0, 3, 2, 2, 2, 0, 4, 2,
2, 4])
所以你有两个图像信息数组(一个未处理,另一个调整大小和展平)以及相应的 class 值列表(我们通常称之为标签)。但是,目前有两处设置不太正确:
1) 这里缺少的是多个 features
- 这些可能包括与从图像的 morphological/computer 视觉过程中提取特征相关的数据的特定数组,或者它们可能是辅助数据,如列表偏好、行为、购买。基本上,任何可以作为数字或分类格式的数组的东西。从技术上讲,您调整大小的图像是第二个功能,但我认为这不会增加太多模型性能。
2) target_names=category
在你的函数中 return 将在 CATEGORIES 中存储最后一次迭代 pf 类别。不知道是不是你想要的
回到你的 table,N 指的是数据集中的图像数量,F 是与该图像关联的相应特征数组的数量。举例来说,假设我们有五十种葡萄酒和五个特征(颜色、味道、酒精含量、pH 值、光密度)。 N of 5 将是这些葡萄酒中的五种,而 F of 2 将是 colour, taste
。
如果我不得不猜测你的特征是什么,它们实际上是一个单一的特征——图像数据本身。查看您的数据结构,您拥有的每个 label/category 都会有多个个体(人),每个人都有该人的多个图像示例。请注意,多个人不是单独的特征 - 按照您构建数据的方式,这些人被分组在一个类别下。
那么,从这里到哪里?在不知道您正在阅读的论文的情况下,很难建议您做什么,但我会回去看看您是否可以向我们提供有关该问题的更多信息。
我正在尝试使用 SVM 在论文上复制实验,以增加我在机器学习方面的 learning/knownledge。在本文中,作者提取特征并选择特征大小。他,然后显示一个table 其中F代表特征向量的大小,N代表人脸图像
然后他使用 F >= 9 和 N >= 15 个参数。
现在,我想做的是像他在论文中所做的那样,真正抓住我提取的特征。
基本上,这就是我提取特征的方式:
def load_image_files(fullpath, dimension=(64, 64)):
descr = "A image classification dataset"
images = []
flat_data = []
target = []
dimension=(64, 64)
for category in CATEGORIES:
path = os.path.join(DATADIR, category)
for person in os.listdir(path):
personfolder = os.path.join(path, person)
for imgname in os.listdir(personfolder):
class_num = CATEGORIES.index(category)
fullpath = os.path.join(personfolder, imgname)
img_resized = resize(skimage.io.imread(fullpath), dimension, anti_aliasing=True, mode='reflect')
flat_data.append(img_resized.flatten())
images.append(skimage.io.imread(fullpath))
target.append(class_num)
flat_data = np.array(flat_data)
target = np.array(target)
images = np.array(images)
print(CATEGORIES)
return Bunch(data=flat_data,
target=target,
target_names=category,
images=images,
DESCR=descr)
如何 select 提取和存储的特征量?或者我如何手动存储具有我需要的特征量的向量?例如一个大小为 9
的特征向量我正在尝试以这种方式分离我的特征:
X_train, X_test, y_train, y_test = train_test_split(
image_dataset.data, image_dataset.target, test_size=0.3,random_state=109)
model = ExtraTreesClassifier(n_estimators=10)
model.fit(X_train, y_train)
print(model.feature_importances_)
不过,我的输出是:
[0. 0. 0. ... 0. 0. 0.]
对于 SVM 分类,我正在尝试使用 OneVsRestClassifier
model_to_set = OneVsRestClassifier(SVC(kernel="poly"))
parameters = {
"estimator__C": [1,2,4,8],
"estimator__kernel": ["poly", "rbf"],
"estimator__degree":[1, 2, 3, 4],
}
model_tunning = GridSearchCV(model_to_set, param_grid=parameters)
model_tunning
model_tunning.fit(X_train, y_train)
prediction = model_tunning.best_estimator_.predict(X_test)
然后,调用预测后,我得到:
Out[29]:
array([1, 0, 4, 2, 1, 3, 3, 0, 1, 1, 3, 4, 1, 1, 0, 3, 2, 2, 2, 0, 4, 2,
2, 4])
所以你有两个图像信息数组(一个未处理,另一个调整大小和展平)以及相应的 class 值列表(我们通常称之为标签)。但是,目前有两处设置不太正确:
1) 这里缺少的是多个 features
- 这些可能包括与从图像的 morphological/computer 视觉过程中提取特征相关的数据的特定数组,或者它们可能是辅助数据,如列表偏好、行为、购买。基本上,任何可以作为数字或分类格式的数组的东西。从技术上讲,您调整大小的图像是第二个功能,但我认为这不会增加太多模型性能。
2) target_names=category
在你的函数中 return 将在 CATEGORIES 中存储最后一次迭代 pf 类别。不知道是不是你想要的
回到你的 table,N 指的是数据集中的图像数量,F 是与该图像关联的相应特征数组的数量。举例来说,假设我们有五十种葡萄酒和五个特征(颜色、味道、酒精含量、pH 值、光密度)。 N of 5 将是这些葡萄酒中的五种,而 F of 2 将是 colour, taste
。
如果我不得不猜测你的特征是什么,它们实际上是一个单一的特征——图像数据本身。查看您的数据结构,您拥有的每个 label/category 都会有多个个体(人),每个人都有该人的多个图像示例。请注意,多个人不是单独的特征 - 按照您构建数据的方式,这些人被分组在一个类别下。
那么,从这里到哪里?在不知道您正在阅读的论文的情况下,很难建议您做什么,但我会回去看看您是否可以向我们提供有关该问题的更多信息。