Применить KNN из небольшого набора данных под наблюдением в большой набор данных без сопровождения в Python - PullRequest
0 голосов
/ 31 января 2019

Я обучил и протестировал модель KNN на небольшом контролируемом наборе данных из примерно 200 образцов в Python.Я хотел бы применить эти результаты к гораздо большему неконтролируемому набору данных из нескольких тысяч выборок.

Мой вопрос: есть ли способ приспособить модель KNN с использованием небольшого контролируемого набора данных, а затем изменить значение Kдля большого набора данных без контроля?Я не хочу переопределять модель, используя низкое значение K из меньшего набора данных, но я не уверен, как подогнать модель и затем изменить значение K в Python.

Возможно ли это с помощью KNN?Есть ли другой способ применить KNN к гораздо большему неконтролируемому набору данных?

Ответы [ 3 ]

0 голосов
/ 31 января 2019

В машинном обучении есть два широких типа учеников, а именно активные ученики (деревья решений, нейронные сети, svms ...) и ленивые ученики, такие как KNN.На самом деле KNN вообще не учится.Он просто сохраняет «помеченные» данные, которые у вас есть, а затем использует их для выполнения вывода, так что он вычисляет, насколько похож новый образец (без метки), на все образцы в данных, которые он сохранил (помеченные данные).Затем на основе большинства голосов K ближайших экземпляров (K ближайших соседей, отсюда и имя) нового образца будет выведен его класс / значение.

Теперь, чтобы перейти к вашему вопросу, «тренировка» KNN не имеет ничего общего с самим K, поэтому при выполнении логического вывода не стесняйтесь использовать то, что K дает лучший результат для вас.

0 голосов
/ 31 января 2019

Я бы порекомендовал установить модель KNN на ваш больший набор данных пару раз, каждый раз используя другое значение для k.Затем для каждой из этих моделей вы можете рассчитать Силуэт .

Сравните различные оценки силуэтов и выберите для своего окончательного значения k (количество кластеров) значение, которое вы использовали для своей модели наивысшей оценки.

В качестве примера приведем некоторый кодВ прошлом году я делал это для себя:

from sklearn import mixture
from sklearn.metrics import silhouette_score
import matplotlib.pyplot as plt


## A list of the different numbers of clusters (the 'n_components' parameter) with 
## which we will run GMM.
number_of_clusters = [2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]

## Graph plotting method
def makePlot(number_of_clusters, silhouette_scores):
    # Plot the each value of 'number of clusters' vs. the silhouette score at that value
    fig, ax = plt.subplots(figsize=(16, 6))
    ax.set_xlabel('GMM - number of clusters')
    ax.set_ylabel('Silhouette Score (higher is better)')
    ax.plot(number_of_clusters, silhouette_scores)

    # Ticks and grid
    xticks = np.arange(min(number_of_clusters), max(number_of_clusters)+1, 1.0)
    ax.set_xticks(xticks, minor=False)
    ax.set_xticks(xticks, minor=True)
    ax.xaxis.grid(True, which='both')
    yticks = np.arange(round(min(silhouette_scores), 2), max(silhouette_scores), .02)
    ax.set_yticks(yticks, minor=False)
    ax.set_yticks(yticks, minor=True)
    ax.yaxis.grid(True, which='both')

## Graph the mean silhouette score of each cluster amount.
## Print out the number of clusters that results in the highest
## silhouette score for GMM.
def findBestClusterer(number_of_clusters):
    silhouette_scores = []
    for i in number_of_clusters:
        clusterer = mixture.GMM(n_components=i) # Use the model of your choice here
        clusterer.fit(<your data set>) # enter your data set's variable name here
        preds = clusterer.predict(<your data set>)
        score = silhouette_score(<your data set>, preds)
        silhouette_scores.append(score)

    ## Print a table of all the silhouette scores
    print("")
    print("| Number of clusters | Silhouette score |")
    print("| ------------------ | ---------------- |")
    for i in range(len(number_of_clusters)):
        ## Ensure printed table is properly formatted, taking into account
        ## amount of digits (either one or two) in the value for number of clusters.
        if number_of_clusters[i] <= 9:
            print("| {number}                  | {score:.4f}           |".format(number=number_of_clusters[i], 
                                                                        score=round(silhouette_scores[i], 4)))
        else:
            print("| {number}                 | {score:.4f}           |".format(number=number_of_clusters[i], 
                                                                        score=round(silhouette_scores[i], 4)))


    ## Graph the plot of silhoutte scores for each amount of clusters
    makePlot(number_of_clusters, silhouette_scores)

    ## Find and print out the cluster amount that gives the highest 
    ## silhouette score.
    best_silhouette_score = max(silhouette_scores)
    index_of_best_score = silhouette_scores.index(best_silhouette_score)
    ideal_number_of_clusters = number_of_clusters[index_of_best_score]
    print("")
    print("Having {} clusters gives the highest silhouette score of {}.".format(ideal_number_of_clusters,
                                                                                round(best_silhouette_score, 4)))

findBestClusterer(number_of_clusters) 

Обратите внимание, что в моем примере я использовал модель GMM вместо KNN, но вы должны иметь возможность слегка изменитьfindBestClusterer() способ использовать любой алгоритм кластеризации, который вы пожелаете.В этом методе вы также укажите свой набор данных.

0 голосов
/ 31 января 2019

Короткий ответ: если вы устанавливаете классификатор KNN с заданным значением k, вы не можете попросить его иметь другое значение k при прогнозировании позже.

Тем не менее, я недумаю, что это то, что вам нужно сделать здесь.Если вы разделите свой контролируемый набор данных на сгибы перекрестной проверки ( см. Документацию scikit-learn ), вы можете поэкспериментировать с различными значениями k, а затем выбрать наиболее подходящее значение для вашего окончательного классификатора и использовать его дляпрогнозы для вашего большего набора данных.

...