У меня есть CSV-файл, который выглядит как показано ниже
date mse
2018-02-11 14.34
2018-02-12 7.24
2018-02-13 244.5
2018-02-14 3.5
2018-02-16 12.67
2018-02-21 45.66
2018-02-22 15.33
2018-02-24 98.44
2018-02-26 23.55
2018-02-27 45.12
2018-02-28 78.44
2018-03-01 34.11
2018-03-05 23.33
2018-03-06 127.45
... ...
... ...
Теперь я пытаюсь применить k означает к значениям mse
, чтобы получить 2clusters
, который дает мне 2centroids
по одному для каждого. Теперь мне дано значение mse
, и мне нужно найти, какой из двух centroids
ближе к заданному значению mse
. сделай что-нибудь вроде этого
from sklearn.cluster import KMeans
import pandas as pd
centroid_list = []
given_mse = 7.382409087
kmeans = KMeans(n_clusters=2)
df = pd.read_csv("data.csv", parse_dates=["date"])
kmeans.fit_predict(df[['mse']])
centroid_list.append(kmeans.cluster_centers_.ravel())
#print(centroids_list) # array([ 153.27996598, 19810.6925875 ]
for i in centroids_list:
t1 = abs(given_mse - i[0])
t2 = abs(given_mse - i[1])
if t1 < t2:
result.append("label 1")
else:
result.append("label 2")
print(result) # ['label1']
Теперь, как вы можете видеть, я получил два значения centroid
: 153.27996598
и 19810.6925875
, назначенные каждому кластеру.
Проблема в том, что он часто переключает значения [(x, y) или (y, x)], когда вы запускаете программу, из-за чего я получаю конечный результат либо как label1
, либо как иногда label2
.
Есть идеи, как это исправить. Есть ли какой-нибудь метод sckit-learn, чтобы предотвратить это переключение?
@ncfirth Мне очень жаль, но я не совсем уверен, что понимаю. Не могли бы вы уточнить?
Создайте отдельный скрипт, в котором вы обучаете модель и сохраняете ее, пример можно увидеть здесь. Затем каждый раз, когда вы используете свою модель, просто загружайте сохраненную, а не переучивайтесь.
Используйте параметр random_state
в KMeans
@VivekKumar спасибо! Работает!
Как упоминал @Vivek Kumar, мне нужно было передать дополнительный параметр random_state
при установке средних k. Значение для random_state
может быть любым целым числом.
kmeans = KMeans(n_clusters=2, random_state=1)
Вы можете сохранить модель и перезагрузить ее, а не переучивать.