Как получить разные результаты при запуске MeanShift из sklearn в одной программе? (Python3)

Вопрос или проблема

Я столкнулся с особенностью MeanShift из sklearn, с которой не знаю, как обойтись.

MeanShift непредсказуемо дает разные результаты при каждом запуске, поэтому я хотел запустить его несколько раз в одной программе, но результаты одинаковы на каждой итерации. Они разные при разных запусках программы, но одинаковы на каждой итерации.

Минимальный код без convert_non_numerical_data(...).

import numpy as np
import pandas as pd
from sklearn.cluster import MeanShift
from sklearn import preprocessing

# ИЗМЕНЕНИЕ: добавлено по запросу 
def convert_non_numerical_data_to_numerical(data_frame):
    columns = data_frame.columns.values

    for col in columns:
        text_digit_vals = {}

        if data_frame[col].dtype in [np.int64, np.float64]:
            continue

        x = 0
        for unique in set(data_frame[col].values):
            if unique not in text_digit_vals:
                text_digit_vals[unique] = x
                x += 1

        def convert_to_int(val):
            return text_digit_vals[val]
        data_frame[col] = list(map(convert_to_int, data_frame[col]))

df = pd.read_csv("test_data/titanic.csv")
df.fillna(0, inplace=True)  # плохая идея подставлять 0?
convert_non_numerical_data_to_numerical(df)

y = np.array(df["survived"])
X = np.array(df.drop(["survived"], 1))
X = preprocessing.scale(X)

run_data = []
for run_count in range(3):
    clf = MeanShift()
    clf.fit(X)
    run_data.append(clf.labels_.copy())
    clf = None

run_0 = run_data[0]
for other_run in run_data[1:]:
    if np.array_equiv(run_0, other_run):
        print("одинаково")
    else:
        print("по-разному")

Вывод:

одинаково
одинаково

Есть идеи, что вызывает это, или хотя бы как это обойти?

Примечание:

Вы смотрели на сглаживание вашего набора данных с помощью каких-либо других методов? Какую настройку гиперпараметров вы сделали? Также как вы преобразовали свои нечисловые данные, просто интересно, можете предоставить pastbin?

Несколько обходных путей:
1- Установите bin_seeding в True и/или используйте случайные семена на каждой итерации.
2- Перемешивайте данные на каждой итерации.

Ответ или решение

Чтобы получить разные результаты при выполнении алгоритма MeanShift из библиотеки scikit-learn в одном и том же программном обеспечении, необходимо учитывать несколько аспектов. Ваша задача заключается в том, чтобы использовать вариативность, встроенную в алгоритм, так как MeanShift, в отличие от некоторых других методов кластеризации, не является детерминированным по умолчанию. Вот несколько стратегий, которые помогут вам добиться разных результатов:

1. Установка параметра bin_seeding

Параметр bin_seeding отвечает за метод инициализации центров кластеров. Если вы установите его значение в True, алгоритм будет использовать биновые центры в качестве начальных, что может повлиять на выходные результаты. Это особенно полезно, если ваши данные разбросаны или имеют сложную структуру.

Пример изменения вашего кода:

clf = MeanShift(bin_seeding=True)

2. Установка случайного состояния

Хотя MeanShift не принимает параметр random_state как некоторые другие алгоритмы, вы можете использовать случайное перемешивание ваших данных перед каждым запуском. Это создаст различные условия для работы алгоритма на каждой итерации. Изменение порядка данных может привести к различиям в результате.

Пример добавления перемешивания в ваш код:

np.random.shuffle(X)

3. Случайное блуждание данных

Ещё одним способом вариативности является добавление небольшого шума к вашим данным перед запуском алгоритма. Это изменение может помочь избежать конвергенции к одному и тому же локальному минимуму.

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

noise = np.random.normal(0, 0.01, X.shape)
X_noisy = X + noise

4. Комплексные подходы

Также можно комбинировать указанные выше подходы. К примеру, перемешивание данных и добавление шума одновременно:

for run_count in range(3):
    np.random.shuffle(X)
    noise = np.random.normal(0, 0.01, X.shape)
    X_noisy = X + noise

    clf = MeanShift(bin_seeding=True)
    clf.fit(X_noisy)
    run_data.append(clf.labels_.copy())

Заключение

С помощью методов, описанных выше, вы сможете значительно увеличить вариативность результатов алгоритма MeanShift, выполняемого в одной программе. Экспериментируя с параметрами и вашими данными, вы получите больше информации о структуре кластеров и особенностях вашего набора данных. Это, в свою очередь, приведет к более глубокой и обоснованной оценке ваших результатов.

Оцените материал
Добавить комментарий

Капча загружается...