НАЙТИ К-среднее расстояние - PullRequest
0 голосов
/ 02 марта 2020

У меня есть база данных, которая имеет 13 функций и 10 миллионов строк. Я хотел применить k-mean, чтобы удалить любые аномалии. Хотя я должен был применить k-mean, создать новый столбец с расстоянием между точками данных и центроидами кластеров и новый столбец со средним расстоянием, и, если расстояние больше среднего расстояния, я удаляю всю строку. Но, похоже, код, который я написал, не работает.

Пример набора данных: https://drive.google.com/open?id=1iB1qjnWQyvoKuN_Pa8Xk4BySzXVTwtUk

df = pd.read_csv('Final After Simple Filtering.csv',index_col=None,low_memory=True)


# Dropping columns with low feature importance
del df['AmbTemp_DegC']
del df['NacelleOrientation_Deg']
del df['MeasuredYawError']



#applying kmeans
#applying kmeans
kmeans = KMeans( n_clusters=8)


clusters= kmeans.fit_predict(df)

centroids = kmeans.cluster_centers_

distance1 = kmeans.fit_transform(df)

distance2 = distance1.mean()

df['distances']=distance1-distance2

df = df[df['distances'] >=0]


del df['distances']

df.to_csv('/content//drive/My Drive/K TEST.csv', index=False)

Ошибка:

KeyError                                  Traceback (most recent call last)
/usr/local/lib/python3.6/dist-packages/pandas/core/indexes/base.py in get_loc(self, key, method, tolerance)
   2896             try:
-> 2897                 return self._engine.get_loc(key)
   2898             except KeyError:

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

KeyError: 'distances'

During handling of the above exception, another exception occurred:

KeyError                                  Traceback (most recent call last)
9 frames
pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

KeyError: 'distances'

During handling of the above exception, another exception occurred:

ValueError                                Traceback (most recent call last)
/usr/local/lib/python3.6/dist-packages/pandas/core/internals/blocks.py in __init__(self, values, placement, ndim)
    126             raise ValueError(
    127                 "Wrong number of items passed {val}, placement implies "
--> 128                 "{mgr}".format(val=len(self.values), mgr=len(self.mgr_locs))
    129             )
    130 

ValueError: Wrong number of items passed 8, placement implies 1

Спасибо вы

Ответы [ 2 ]

1 голос
/ 02 марта 2020

Вот ответ на ваш последний вопрос.

import seaborn as sns
import pandas as pd
titanic = sns.load_dataset('titanic')
titanic = titanic.copy()
titanic = titanic.dropna()
titanic['age'].plot.hist(
  bins = 50,
  title = "Histogram of the age variable"
)


from scipy.stats import zscore
titanic["age_zscore"] = zscore(titanic["age"])
titanic["is_outlier"] = titanic["age_zscore"].apply(
  lambda x: x <= -2.5 or x >= 2.5
)
titanic[titanic["is_outlier"]]


ageAndFare = titanic[["age", "fare"]]
ageAndFare.plot.scatter(x = "age", y = "fare")


from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
ageAndFare = scaler.fit_transform(ageAndFare)
ageAndFare = pd.DataFrame(ageAndFare, columns = ["age", "fare"])
ageAndFare.plot.scatter(x = "age", y = "fare")


from sklearn.cluster import DBSCAN
outlier_detection = DBSCAN(
  eps = 0.5,
  metric="euclidean",
  min_samples = 3,
  n_jobs = -1)
clusters = outlier_detection.fit_predict(ageAndFare)

clusters


from matplotlib import cm
cmap = cm.get_cmap('Accent')
ageAndFare.plot.scatter(
  x = "age",
  y = "fare",
  c = clusters,
  cmap = cmap,
  colorbar = False
)

enter image description here

См. Эту ссылку для всех деталей.

https://www.mikulskibartosz.name/outlier-detection-with-scikit-learn/

До сегодняшнего дня я никогда не слышал о «Факторе локальных выбросов». Когда я его погуглил, я получил некоторую информацию, которая, кажется, указывает на то, что это производная от DBSCAN Наконец, я думаю, что мой первый ответ на самом деле лучший способ обнаружить выбросы. DBSCAN объединяет в единое целое go, что приводит к обнаружению выбросов, которые действительно считаются «шумом». Я не думаю, что основной целью DBSCAN является обнаружение аномалий, а скорее кластеризация. В заключение нужно немного умения правильно выбирать гиперпараметры. Кроме того, DBSCAN может быть медленным на очень больших наборах данных, поскольку ему неявно необходимо вычислять эмпирическую плотность для каждой точки выборки, что приводит к квадратичной сложности времени наихудшего времени c, что довольно медленно для больших наборов данных.

1 голос
/ 02 марта 2020

Вы: Я хотел применить k-mean, чтобы удалить любые аномалии.

На самом деле KMeas обнаружит аномалии и включит их в ближайший кластер. Функция потерь - это минимальная сумма квадратов расстояний от каждой точки до назначенного ей кластерного центроида. Если вы хотите исключить выбросы, рассмотрите возможность использования методологии z-показателя.

import numpy as np
import pandas as pd

# import your data
df = pd.read_csv('C:\\Users\\your_file.csv)

# get only numerics
numerics = ['int16', 'int32', 'int64', 'float16', 'float32', 'float64']
newdf = df.select_dtypes(include=numerics)

df = newdf

# count rows in DF before kicking out records with z-score over 3
df.shape

# handle NANs
df = df.fillna(0)


from scipy import stats
df = df[(np.abs(stats.zscore(df)) < 3).all(axis=1)]
df.shape


df = pd.DataFrame(np.random.randn(100, 3))
from scipy import stats
df[(np.abs(stats.zscore(df)) < 3).all(axis=1)]

# count rows in DF before kicking out records with z-score over 3
df.shape

Кроме того, посмотрите на эти ссылки, когда у вас будет немного свободного времени.

https://medium.com/analytics-vidhya/effect-of-outliers-on-k-means-algorithm-using-python-7ba85821ea23

https://statisticsbyjim.com/basics/outliers/

...