Вопрос или проблема
Я столкнулся с особенностью 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("по-разному")
Вывод:
одинаково
одинаково
Есть идеи, что вызывает это, или хотя бы как это обойти?
Примечание:
- Набор данных из pythonprogramming.net
Вы смотрели на сглаживание вашего набора данных с помощью каких-либо других методов? Какую настройку гиперпараметров вы сделали? Также как вы преобразовали свои нечисловые данные, просто интересно, можете предоставить 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, выполняемого в одной программе. Экспериментируя с параметрами и вашими данными, вы получите больше информации о структуре кластеров и особенностях вашего набора данных. Это, в свою очередь, приведет к более глубокой и обоснованной оценке ваших результатов.