Модели классификаторов
Модератор: Olej
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Модели классификаторов
Это касается любых распознавателей образов: как классифицировать распознанный образ между некоторыми классами, некоторыми эталонными образцами?
Первый приходящий на ум ответ:
- к какому эталонному образцу распознаваемый ближе, в выбранной метрике оценивания, к тому классу что и образец и принадлежит объект.
Ответ неверный.
И вот картинка (правильного распознавания):
- здесь эталоны 2-х классов (размечены цветом);
- каждый из 2-х классифицируемых объектов ближе (по метрике) к объекту другого класса;
- но принадлежит к совсем другому классу (и интуитивно и по методу KNN, которым получена картинка);
Первый приходящий на ум ответ:
- к какому эталонному образцу распознаваемый ближе, в выбранной метрике оценивания, к тому классу что и образец и принадлежит объект.
Ответ неверный.
И вот картинка (правильного распознавания):
- здесь эталоны 2-х классов (размечены цветом);
- каждый из 2-х классифицируемых объектов ближе (по метрике) к объекту другого класса;
- но принадлежит к совсем другому классу (и интуитивно и по методу KNN, которым получена картинка);
- Вложения
-
- s2.png (22.43 КБ) 3799 просмотров
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Модели классификаторов
Метод KNN - 1-й из рассматриваемых - метод K ближайших соседей.Olej писал(а):- но принадлежит к совсем другому классу (и интуитивно и по методу KNN, которым получена картинка);
Программа ручной реализации метода KNN, понятной по коду как он работает: объект принадлежит к тому классу, к которому принадлежат большинство из окружения K (3, 5, 7, ...) его соседей:Задача классификации в машинном обучении — это задача отнесения объекта к одному из заранее определенных классов на основании его формализованных признаков. Каждый из объектов в этой задаче представляется в виде вектора в N-мерном пространстве, каждое измерение в котором представляет собой описание одного из признаков объекта.
Код: Выделить всё
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
import random
import math
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
def inPoint( prompt ):
while( True ):
sys.stdout.write( prompt )
sys.stdout.flush()
s = sys.stdin.readline()
if s == '\n' or s == '': # Enter or ^D - завершение ввода
sys.stdout.write( '\r' )
return None
try:
( x, y ) = s.split()
p = ( float( x ), float( y ) )
except Exception as err:
print( 'format error: ' + str( err ) )
continue
return p
def generateData( Classes, numberOfEl = 10 ): # Genegate train data
data = []
for num in range( len( Classes ) ):
for row in range( numberOfEl ): # Choose numberOfEl random nodes with RMS=1
data.append( [ [ random.gauss( Classes[ num ][ 0 ], 1.0 ),
random.gauss( Classes[ num ][ 1 ], 1.0 ) ], num ] )
return data
print( 'training center coordinates (format: X Y ; Enter or ^D - finish)' )
centers = []
while True:
z = inPoint( 'point number {} : '.format( len( centers ) + 1 ) )
if( z == None ): break;
centers.append( z )
print( centers )
if len( sys.argv ) > 1:
train = generateData( centers, int( sys.argv[ 1 ] ) )
else:
train = generateData( centers )
print( '{} => {}'.format( len( centers ), len( train ) ) )
colors = []
groups = []
for c in range( len( centers ) ):
colors.append( matplotlib.colors.to_hex( ( random.random(), random.random(), random.random() ) ) )
groups.append( 'class #{:02d}'.format( c ) )
clist = matplotlib.colors.ListedColormap( colors )
print( groups )
def classifyKNN( trainData, testData, k ): # KNN classification procedure
def dist( a, b ): #Euclidean distance between 2-dimensional point
return math.sqrt( ( a[ 0 ] - b[ 0 ] ) ** 2 + ( a[ 1 ] - b[ 1 ] ) ** 2 )
testLabels = []
for testPoint in testData:
#Claculate distances between test point and all of the train points
testDist = [ [ dist( testPoint[ 0 ], trainData[ i ][ 0 ] ), trainData[ i ][ 1 ] ]
for i in range( len( trainData ) ) ]
#How many points of each class among nearest K
stat = [ 0 for i in range( len( trainData ) ) ]
for d in sorted( testDist )[ 0:k ]:
stat[ d[ 1 ] ] += 1
#Assign a class with the most number of occurences among K nearest neighbours
testLabels.append( sorted( zip( stat, range( len( trainData ) ) ), reverse = True )[ 0 ][ 1 ] )
return testLabels
k = 5 # numner nearest neighbours
if len( sys.argv ) > 2:
k = int( sys.argv[ 2 ] )
while True:
test = []
print( 'testing points (format: X Y ; Enter or ^D - finish)' )
while True:
z = inPoint( 'point number {} : '.format( len( test ) + 1 ) )
if( z == None ): break;
test.append( [ [ z[ 0 ], z[ 1 ] ], 0 ] )
if 0 == len( test ): break
for i in range( len( centers ) ):
plt.scatter( centers[ i ][ 0 ], centers[ i ][ 1 ],
label = groups[ i ], marker = '^',
c = colors[ i ] ) # center / legend points
plt.scatter( [ train[ i ][ 0 ][ 0 ] for i in range( len( train ) ) ],
[ train[ i ][ 0 ][ 1 ] for i in range( len( train ) ) ],
c = [ train[ i ][ 1 ] for i in range( len( train ) ) ],
cmap = clist ) # train points
labels = classifyKNN( train, test, k )
print( labels )
for i in range( len( test ) ):
plt.scatter( test[ i ][ 0 ][ 0 ], test[ i ][ 0 ][ 1 ],
s = 200, marker = '+', alpha = 0.5,
c = colors[ labels[ i ] ] ) # test points
plt.legend( groups )
# pl.legend( loc = 2 )
plt.gcf().canvas.set_window_title( 'manual implementation KNN' )
plt.show()
Код: Выделить всё
<pre>olej@ACER:~/2019_WORK/own.WORK/MachineLearning$ ./modrn.py 40 7
training center coordinates (format: X Y ; Enter or ^D - finish)
point number 1 : 0 3
point number 2 : 3 3
point number 3 : 3 0
point number 4 : 0 0
point number 5 :
[(0.0, 3.0), (3.0, 3.0), (3.0, 0.0), (0.0, 0.0)]
4 => 160
['class #00', 'class #01', 'class #02', 'class #03']
testing points (format: X Y ; Enter or ^D - finish)
point number 1 : 1 1
point number 2 : 1 2
point number 3 : 2 2
point number 4 : 2 1
point number 5 :
[3, 0, 1, 3]
testing points (format: X Y ; Enter or ^D - finish)
point number 1 :
</pre>
- Вложения
-
- modrn.py
- (3.94 КБ) 145 скачиваний
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Модели классификаторов
Тот же метод, но реализуемый алгоритмами машинного обучения из пакета Sklearn:Olej писал(а): Метод KNN - 1-й из рассматриваемых - метод K ближайших соседей.
Код: Выделить всё
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
import random
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from sklearn import neighbors
def inPoint( prompt ):
while( True ):
sys.stdout.write( prompt )
sys.stdout.flush()
s = sys.stdin.readline()
if s == '\n' or s == '': # Enter or ^D - завершение ввода
sys.stdout.write( '\r' )
return None
try:
( x, y ) = s.split()
p = ( float( x ), float( y ) )
except Exception as err:
print( 'format error: ' + str( err ) )
continue
return p
def generateData( Classes, numberOfEl = 10 ): # Genegate train data
data = []
for num in range( len( Classes ) ):
for row in range( numberOfEl ): # Choose numberOfEl random nodes with RMS=1
data.append( [ [ random.gauss( Classes[ num ][ 0 ], 1.0 ),
random.gauss( Classes[ num ][ 1 ], 1.0 ) ], num ] )
return data
print( 'training center coordinates (format: X Y ; Enter or ^D - finish)' )
centers = []
while True:
z = inPoint( 'point number {} : '.format( len( centers ) + 1 ) )
if( z == None ): break;
centers.append( z )
print( centers )
if len( sys.argv ) > 1:
train = generateData( centers, int( sys.argv[ 1 ] ) )
else:
train = generateData( centers )
print( '{} => {}'.format( len( centers ), len( train ) ) )
colors = []
groups = []
for c in range( len( centers ) ):
colors.append( matplotlib.colors.to_hex( ( random.random(), random.random(), random.random() ) ) )
groups.append( 'class #{:02d}'.format( c ) )
clist = matplotlib.colors.ListedColormap( colors )
print( groups )
k = 5 # numner nearest neighbours
if len( sys.argv ) > 2:
k = int( sys.argv[ 2 ] )
#print( len( train ), train )
X = []
y = []
for t in train:
X.append( t[ 0 ] )
y.append( t[ 1 ] )
# Create and train the KNN classifier
model = neighbors.KNeighborsClassifier( n_neighbors = k, weights = 'distance' )
model.fit( X, y )
print( model )
while True:
test = []
print( 'testing points (format: X Y ; Enter or ^D - finish)' )
while True:
z = inPoint( 'point number {} : '.format( len( test ) + 1 ) )
if( z == None ): break;
test.append( [ z[ 0 ], z[ 1 ] ] )
if 0 == len( test ): break
for i in range( len( centers ) ):
plt.scatter( centers[ i ][ 0 ], centers[ i ][ 1 ],
label = groups[ i ], marker = '^',
c = colors[ i ] ) # center / legend points
plt.scatter( [ train[ i ][ 0 ][ 0 ] for i in range( len( train ) ) ],
[ train[ i ][ 0 ][ 1 ] for i in range( len( train ) ) ],
c = [ train[ i ][ 1 ] for i in range( len( train ) ) ],
cmap = clist ) # train points
labels = model.predict( test )
print( labels )
for i in range( len( test ) ):
plt.scatter( test[ i ][ 0 ], test[ i ][ 1 ],
s = 200, marker = '+', alpha = 0.5,
c = colors[ labels[ i ] ] ) # test points
plt.legend( groups )
# pl.legend( loc = 2 )
plt.gcf().canvas.set_window_title( 'KNeighborsClassifier' )
plt.show()
Код: Выделить всё
olej@ACER:~/2019_WORK/own.WORK/MachineLearning$ ./modrs.py 20 7
training center coordinates (format: X Y ; Enter or ^D - finish)
point number 1 : 0 0
point number 2 : 3 0
point number 3 : 3 3
point number 4 : 0 3
point number 5 :
[(0.0, 0.0), (3.0, 0.0), (3.0, 3.0), (0.0, 3.0)]
4 => 80
['class #00', 'class #01', 'class #02', 'class #03']
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
metric_params=None, n_jobs=None, n_neighbors=7, p=2,
weights='distance')
testing points (format: X Y ; Enter or ^D - finish)
point number 1 : 1 1
point number 2 : 1 2
point number 3 : 2 2
point number 4 : 2 1
point number 5 :
[1 3 3 3]
testing points (format: X Y ; Enter or ^D - finish)
point number 1 :
- Вложения
-
- modrs.py
- (3.3 КБ) 143 скачивания
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Модели классификаторов
А теперь такое же приложение, но позволяющее использовать (пока всё в черновом виде) 5 различных классификаторов из Sklearn на выбор:Olej писал(а): Тот же метод, но реализуемый алгоритмами машинного обучения из пакета Sklearn:
Код: Выделить всё
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import argparse
import random
import matplotlib
import matplotlib.pyplot as plt
from sklearn import metrics
from sklearn import neighbors
from sklearn.linear_model import LogisticRegression
from sklearn.naive_bayes import GaussianNB
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC
from common import inPoint, generateData
parser = argparse.ArgumentParser() # Construct the argument parse and parse the arguments
parser.add_argument( '-p', '--points', required = False, type=int, help = 'numbes points into class' )
parser.add_argument( '-m', '--model', required = False, type=int, help = 'model number' )
parser.add_argument( '-d', '--data', required = False, type=int, help = 'add model parameter' )
args = vars( parser.parse_args() )
#print( args )
data = 5 # numner nearest neighbours
if args[ 'data' ] != None:
data = int( args[ 'data' ] )
models_title = ( 'KNeighborsClassifier' , 'LogisticRegression',
'GaussianNB' , 'DecisionTreeClassifier',
'Support Vector Machines'
)
#print( len( models_title ) )
modl_num = 0
modl_num = int( args[ 'model' ] )
if( modl_num >= len( models_title ) or modl_num < 0 ):
modl_num = 0
model_title = models_title[ modl_num ]
if 0 == modl_num: # K Nearest Neighbors
model = neighbors.KNeighborsClassifier( n_neighbors = data, weights = 'distance' )
elif 1 == modl_num: # Logistic Regression, one-vs-all
model = LogisticRegression()
elif 2 == modl_num: # Naive Bayes
model = GaussianNB()
elif 3 == modl_num: # Classification and Regression Trees (CART)
model = DecisionTreeClassifier()
elif 4 == modl_num: # Support Vector Machines
model = SVC()
print( model )
print( 'training center coordinates (format: X Y ; Enter or ^D - finish)' )
centers = []
while True:
z = inPoint( 'point number {} : '.format( len( centers ) + 1 ) )
if( z == None ): break;
centers.append( z )
print( centers )
if args[ 'points' ] != None: # debug = int( args[ 'verbose' ] )
train = generateData( centers, int( args[ 'points' ] ) )
else:
train = generateData( centers )
print( '{} classes => {} points in each'.format( len( centers ), len( train ) ) )
colors = []
groups = []
for c in range( len( centers ) ):
colors.append( matplotlib.colors.to_hex( ( random.random(), random.random(), random.random() ) ) )
groups.append( 'class #{:02d}'.format( c ) )
clist = matplotlib.colors.ListedColormap( colors )
print( groups )
#print( len( train ), train )
X = []
y = []
for t in train:
X.append( t[ 0 ] )
y.append( t[ 1 ] )
model.fit( X, y ) # train a classifier
while True: # test data
test = []
print( 'testing points (format: X Y ; Enter or ^D - finish)' )
while True:
z = inPoint( 'point number {} : '.format( len( test ) + 1 ) )
if( z == None ): break;
test.append( [ z[ 0 ], z[ 1 ] ] )
if 0 == len( test ): break
for i in range( len( centers ) ):
plt.scatter( centers[ i ][ 0 ], centers[ i ][ 1 ],
label = groups[ i ], marker = '^',
c = colors[ i ] ) # center / legend points
plt.scatter( [ train[ i ][ 0 ][ 0 ] for i in range( len( train ) ) ],
[ train[ i ][ 0 ][ 1 ] for i in range( len( train ) ) ],
c = [ train[ i ][ 1 ] for i in range( len( train ) ) ],
cmap = clist ) # train points
labels = model.predict( test )
print( labels )
for i in range( len( test ) ):
plt.scatter( test[ i ][ 0 ], test[ i ][ 1 ],
s = 200, marker = '+', alpha = 0.5,
c = colors[ labels[ i ] ] ) # test points
plt.legend( groups )
# pl.legend( loc = 2 )
plt.gcf().canvas.set_window_title( model_title )
plt.show()
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Модели классификаторов
Olej писал(а): А теперь такое же приложение, но позволяющее использовать (пока всё в черновом виде) 5 различных классификаторов из Sklearn на выбор:
Код: Выделить всё
olej@ACER:~/2019_WORK/own.WORK/MachineLearning$ ./modrsm.py --help
usage: modrsm.py [-h] [-p POINTS] [-m MODEL] [-d DATA]
optional arguments:
-h, --help show this help message and exit
-p POINTS, --points POINTS
numbes points into class
-m MODEL, --model MODEL
model number
-d DATA, --data DATA add model parameter
Код: Выделить всё
olej@ACER:~/2019_WORK/own.WORK/MachineLearning$ ./modrsm.py -m 1
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
intercept_scaling=1, max_iter=100, multi_class='warn',
n_jobs=None, penalty='l2', random_state=None, solver='warn',
tol=0.0001, verbose=0, warm_start=False)
training center coordinates (format: X Y ; Enter or ^D - finish)
point number 1 : 0 3
point number 2 : 3 0
point number 3 :
[(0.0, 3.0), (3.0, 0.0)]
2 classes => 10.0 points in each
['class #00', 'class #01']
/usr/local/lib/python3.7/dist-packages/sklearn/linear_model/logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.
FutureWarning)
testing points (format: X Y ; Enter or ^D - finish)
point number 1 : 2 2
point number 2 :
[1]
testing points (format: X Y ; Enter or ^D - finish)
point number 1 :
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Модели классификаторов
Код: Выделить всё
olej@ACER:~/2019_WORK/own.WORK/MachineLearning$ ./modrsm.py -m 2
GaussianNB(priors=None, var_smoothing=1e-09)
training center coordinates (format: X Y ; Enter or ^D - finish)
point number 1 : 0 3
point number 2 : 3 0
point number 3 :
[(0.0, 3.0), (3.0, 0.0)]
2 classes => 20 points in each
['class #00', 'class #01']
testing points (format: X Y ; Enter or ^D - finish)
point number 1 : 2 2
point number 2 :
[0]
testing points (format: X Y ; Enter or ^D - finish)
point number 1 :
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Модели классификаторов
Код: Выделить всё
olej@ACER:~/2019_WORK/own.WORK/MachineLearning$ ./modrsm.py -m 3
DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=None,
max_features=None, max_leaf_nodes=None,
min_impurity_decrease=0.0, min_impurity_split=None,
min_samples_leaf=1, min_samples_split=2,
min_weight_fraction_leaf=0.0, presort=False, random_state=None,
splitter='best')
training center coordinates (format: X Y ; Enter or ^D - finish)
point number 1 : 0 3
point number 2 : 3 0
point number 3 :
[(0.0, 3.0), (3.0, 0.0)]
2 classes => 20 points in each
['class #00', 'class #01']
testing points (format: X Y ; Enter or ^D - finish)
point number 1 : 2 2
point number 2 :
[0]
testing points (format: X Y ; Enter or ^D - finish)
point number 1 :
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Модели классификаторов
Код: Выделить всё
olej@ACER:~/2019_WORK/own.WORK/MachineLearning$ ./modrsm.py -m 4
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
decision_function_shape='ovr', degree=3, gamma='auto_deprecated',
kernel='rbf', max_iter=-1, probability=False, random_state=None,
shrinking=True, tol=0.001, verbose=False)
training center coordinates (format: X Y ; Enter or ^D - finish)
point number 1 : 0 3
point number 2 : 3 0
point number 3 :
[(0.0, 3.0), (3.0, 0.0)]
2 classes => 20 points in each
['class #00', 'class #01']
/usr/local/lib/python3.7/dist-packages/sklearn/svm/base.py:196: FutureWarning: The default value of gamma will change from 'auto' to 'scale' in version 0.22 to account better for unscaled features. Set gamma explicitly to 'auto' or 'scale' to avoid this warning.
"avoid this warning.", FutureWarning)
testing points (format: X Y ; Enter or ^D - finish)
point number 1 : 2 2
point number 2 :
[0]
testing points (format: X Y ; Enter or ^D - finish)
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Модели классификаторов
Код: Выделить всё
olej@ACER:~/2019_WORK/own.WORK/MachineLearning$ ./modrsm.py -m 0 -p 25 -d 9
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
metric_params=None, n_jobs=None, n_neighbors=9, p=2,
weights='distance')
training center coordinates (format: X Y ; Enter or ^D - finish)
point number 1 : 0 3
point number 2 : 3 0
point number 3 :
[(0.0, 3.0), (3.0, 0.0)]
2 classes => 25.0 points in each
['class #00', 'class #01']
testing points (format: X Y ; Enter or ^D - finish)
point number 1 : 2 2
point number 2 :
[1]
testing points (format: X Y ; Enter or ^D - finish)
point number 1 :
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Модели классификаторов
Это всё модельные данные, искусственно генерируемые.
Но для распознавания и классификации ценнее и интереснее реальные данные из различных областей знаний. Но их собрать совсем не так просто, трудоёмко. Но исследователи из области обработки данных многими годами собирали такие наборы данных, для тестирования и отработки алгоритмов распознавания.
Вот один из таких публичных наборов баз данных: Index of /ml/machine-learning-databases - здесь несколько сот баз данных, от нескольких сот до тысяч реализаций в каждом наборе данных.
Здесь собираются наборы данных начиная с середины 90-х годов.
Дальше реализую модели классификации на этих (некоторых) наборах данных...
Но для распознавания и классификации ценнее и интереснее реальные данные из различных областей знаний. Но их собрать совсем не так просто, трудоёмко. Но исследователи из области обработки данных многими годами собирали такие наборы данных, для тестирования и отработки алгоритмов распознавания.
Вот один из таких публичных наборов баз данных: Index of /ml/machine-learning-databases - здесь несколько сот баз данных, от нескольких сот до тысяч реализаций в каждом наборе данных.
Здесь собираются наборы данных начиная с середины 90-х годов.
Дальше реализую модели классификации на этих (некоторых) наборах данных...
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 4 гостя