【发布时间】:2021-07-23 23:59:46
【问题描述】:
我使用 sklearn 在大量数据上迭代训练了一个 SVM。每个 csv 文件都是图像的一部分。我用滑动窗口制作了那些。我使用 partial_fit() 来拟合 SVM 和缩放器。特征是图像的 RGBN 值,我想将图像分为两个不同的组 0 和 1。
def trainSVMIterative(directory):
clf= SGDClassifier(learning_rate = 'constant', eta0 = 0.1, shuffle = False,n_iter_no_change = 5, warm_start = True )
sc = StandardScaler()
firstIter = True
iter = 0
for filename in os.listdir(directory):
if filename.endswith('.csv'):
pixels = pd.read_csv(os.path.join(directory, filename),sep = ',')
#drop columns containing irelevant information
pixels = pixels.drop('x', axis = 1)
pixels = pixels.drop('y', axis = 1)
#dataset
X = pixels.drop('label', axis = 1)
#labels
Y = pixels['label']
#prepare training data
X_train, X_test, y_train, y_test = train_test_split(X,Y,test_size = 0.2, random_state = 42)
#fit scaler
sc = sc.partial_fit(X)
#scale input
X_train = sc.transform(X_train)
X_test = sc.transform(X_test)
#train svm
if firstIter:
clf.partial_fit(X_train,y_train, classes=np.unique(Y))
firstIter = False
else:
clf.partial_fit(X_train,y_train)
testPred = clf.predict(X_test)
print(classification_report(y_test,testPred))
iter+=1
print(iter)
return clf, sc
当我在每次迭代后打印分类报告时,它看起来很好,准确率高达 98%。因此,我假设我的分类器正在正确训练。 为了测试,我从原始图像中提取了一个新的数据框。这一次,没有带有标签的列。我将分类器和定标器传递给我的测试函数
def testClassifier(path, classifier, scaler):
#opening the original image, same process as in creating the training data
raster = gdal.Open(path)
array = tifToImgArray(raster, 'uint8')
# select a part of the image to test on
windowSize = 1000
y = 19000
x = 0
window = array[y:y + windowSize,x:x + windowSize]
#create the dataframe
arrayData = []
for i in range(window.shape[0]):
for j in range(window.shape[1]):
arrayData.append([i,j,array[i,j,0],array[i,j,1],array[i,j,2],array[i,j,3]])
dfData = pd.DataFrame(arrayData, columns=['x','y','R','G','B','N'])
#again drop psoition information
pixels = dfData.drop('x', axis = 1)
pixels = pixels.drop('y', axis = 1)
#use scaler
pixels = scaler.transform(pixels)
#make prediction
prediction = classifier.predict(pixels)
image = visualizePrediction(prediction, window, dfData)
return image
我现在的问题是,分类器为每个像素预测标签“1”。我用于测试的数据框 X 与我在一次训练中使用的相同,只是在训练测试数据时没有拆分,我只是使用了整个集合。我真的不明白我做错了什么,因为分类器在 X 的一个子集上工作得很好。我认为这可能是一个问题,即有更多的数据点标记为“1”然后标记为“0”并且我不使用对数据的任何权重。但是,当我将数据集拆分为 X_train 和 X_test 时,为什么它会起作用,因为那里也是如此。 我会在这个问题上提供帮助。 问候
【问题讨论】:
标签: python machine-learning scikit-learn