[44][Machine Learning] (3)

Jakie są standardowe sposoby obliczania odległości między poszczególnymi zapytaniami?

Zadałem podobne pytanie, pytając o odległość między „dokumentami” (artykuły z Wikipedii, wiadomości itp.). Zrobiłem to osobnym pytaniem, ponieważ zapytania wyszukiwania są znacznie mniejsze niż dokumenty i są znacznie głośniejsze. Dlatego nie wiem (i wątpię), czy zostaną tutaj użyte te same metryki odległości. Preferowane są albo waniliowe, leksykalne metryki odległości, albo najnowocześniejsze semantyczne metryki odległości, przy czym bardziej preferowane są te drugie.

Z mojego doświadczenia wynika, że ​​tylko niektóre klasy zapytań można podzielić na cechy leksykalne (ze względu na niejednoznaczność języka naturalnego). Zamiast tego możesz spróbować użyć logicznych wyników wyszukiwania (witryn lub segmentów witryn, a nie dokumentów, bez rankingu) jako funkcji klasyfikacji (zamiast słów). To podejście sprawdza się dobrze w klasach, w których zapytanie zawiera dużą niejednoznaczność leksykalną, ale istnieje wiele dobrych witryn związanych z zapytaniem (np. Filmy, muzyka, zapytania reklamowe itp.).

Ponadto w przypadku klasyfikacji offline można wykonać LSI w macierzy witryny zapytań. Szczegółowe informacje można znaleźć w książce „Wprowadzenie do wyszukiwania informacji”.

Miara podobieństwa cosinusowego wykonuje dobrą (jeśli nie idealną) pracę przy kontrolowaniu długości dokumentu, więc porównanie podobieństwa 2 dokumentów lub 2 zapytań przy użyciu metryki cosinus i wag tf idf dla słów powinno działać dobrze w obu przypadkach. Poleciłbym również najpierw wykonać LSA na wagach tf idf, a następnie obliczyć cosinus odległość \ podobieństwa. Jeśli próbujesz zbudować wyszukiwarkę, polecam skorzystanie z bezpłatnej wyszukiwarki open source, takiej jak solr lub wyszukiwanie elastyczne, lub po prostu bibliotek surowego lucene, ponieważ wykonują większość pracy za Ciebie i mają dobre wbudowane metody obsługa zapytania w celu udokumentowania problemu podobieństwa.

Najlepsza biblioteka Pythona dla sieci neuronowych

Używam sieci neuronowych do rozwiązywania różnych problemów związanych z uczeniem maszynowym. Używam Pythona i pybrain, ale ta biblioteka jest prawie wycofana. Czy w Pythonie są inne dobre alternatywy?

AKTUALIZACJA: krajobraz nieco się zmienił, odkąd odpowiedziałem na to pytanie w lipcu 2014 roku, a w kosmos pojawiło się kilku nowych graczy. W szczególności polecam sprawdzić:

Lasagne: https://github.com/Lasagne/Lasagne

Keras: https://github.com/fchollet/keras

Deepy: https://github.com/uaca/deepy

Nolearn: https://github.com/dnouri/nolearn

Bloki: https://github.com/mila-udem/blocks

TensorFlow: https://github.com/tensorflow/tensorflow

Każdy z nich ma swoje mocne i słabe strony, więc daj im szansę i zobacz, który najlepiej pasuje do Twojego przypadku użycia. Chociaż rok temu poleciłbym używanie pylearn2, społeczność nie jest już aktywna, więc poleciłbym poszukać gdzie indziej. Moja pierwotna odpowiedź na odpowiedź znajduje się poniżej, ale w tym momencie jest ona w dużej mierze nieistotna. Pylearn2 jest ogólnie uważany za bibliotekę z wyboru dla sieci neuronowych i głębokiego uczenia się w Pythonie. Został zaprojektowany z myślą o łatwych eksperymentach naukowych, a nie łatwości użytkowania, więc krzywa uczenia się jest dość stroma, ale jeśli nie spiesz się i zastosujesz samouczki

Myślę, że będziesz zadowolony z jego funkcji. Zapewnione jest wszystko, od standardowych perceptronów wielowarstwowych, przez maszyny Boltzmanna z ograniczeniami, po sieci splotowe, po autenkodery. Zapewnia świetne wsparcie dla GPU i wszystko jest oparte na Theano, więc wydajność jest zazwyczaj całkiem dobra. Źródło Pylearn2 jest dostępne na github. Należy pamiętać, że Pylearn2 ma obecnie przeciwny problem do pybrain – zamiast zostać porzuconym, Pylearn2 jest w trakcie aktywnego rozwoju i podlega częstym zmianom.

Tensor Flow (docs) od Google to kolejny fajny framework, który ma automatyczne różnicowanie. Zapisałem kilka krótkich przemyśleń na temat Google Tensor Flow na moim blogu, wraz z przykładem MNIST, który mają w swoim samouczku. Lasagne (dokumentacja) jest bardzo fajna, ponieważ wykorzystuje theano (→ możesz użyć GPU) i sprawia, że ​​jest prostszy w użyciu. O ile wiem, autor lasagne wygrał wyzwanie Galaktyki Kaggle. Miło jest, gdy się nie uczysz. Oto przykładowa sieć MNIST:

#!/usr/bin/env python

import lasagne

from lasagne import layers

from lasagne.updates import nesterov_momentum

from nolearn.lasagne import NeuralNet

import sys

import os

import gzip

import pickle

import numpy

PY2 = sys.version_info[0] == 2

if PY2:

from urllib import urlretrieve

def pickle_load(f, encoding):

return pickle.load(f)

else:

from urllib.request import urlretrieve

def pickle_load(f, encoding):

return pickle.load(f, encoding=encoding)

DATA_URL = ‘http://deeplearning.net/data/mnist/mnist.pkl.gz’

DATA_FILENAME = ‘mnist.pkl.gz’

def _load_data(url=DATA_URL, filename=DATA_FILENAME):

“””Load data from `url` and store the result in `filename`.”””

if not os.path.exists(filename):

print(“Downloading MNIST dataset”)

urlretrieve(url, filename)

with gzip.open(filename, ‘rb’) as f:

return pickle_load(f, encoding=’latin-1′)

def load_data():

“””Get data with labels, split into training, validation and test set.”””

data = _load_data()

X_train, y_train = data[0]

X_valid, y_valid = data[1]

X_test, y_test = data[2]

y_train = numpy.asarray(y_train, dtype=numpy.int32)

y_valid = numpy.asarray(y_valid, dtype=numpy.int32)

y_test = numpy.asarray(y_test, dtype=numpy.int32)

return dict(

X_train=X_train,

y_train=y_train,

X_valid=X_valid,

y_valid=y_valid,

X_test=X_test,

y_test=y_test,

num_examples_train=X_train.shape[0],

num_examples_valid=X_valid.shape[0],

num_examples_test=X_test.shape[0],

input_dim=X_train.shape[1],

output_dim=10,

)

def nn_example(data):

net1 = NeuralNet(

layers=[(‘input’, layers.InputLayer),

(‘hidden’, layers.DenseLayer),

(‘output’, layers.DenseLayer),

],

# layer parameters:

input_shape=(None, 28*28),

hidden_num_units=100, # number of units in ‘hidden’ layer

output_nonlinearity=lasagne.nonlinearities.softmax,

output_num_units=10, # 10 target values for the digits 0, 1, 2, …, 9

# optimization method:

update=nesterov_momentum,

update_learning_rate=0.01,

update_momentum=0.9,

max_epochs=10,

verbose=1,

)

# Train the network

net1.fit(data[‘X_train’], data[‘y_train’])

# Try the network on new data

print(“Feature vector (100-110): %s” % data[‘X_test’][0][100:110])

print(“Label: %s” % str(data[‘y_test’][0]))

print(“Predicted: %s” % str(net1.predict([data[‘X_test’][0]])))

def main():

data = load_data()

print(“Got %i testing datasets.” % len(data[‘X_train’]))

nn_example(data)

if __name__ == ‘__main__’:

main()

Caffe jest biblioteką C ++, ale ma powiązania z Pythonem. Większość rzeczy możesz zrobić za pomocą plików konfiguracyjnych (prototxt). Ma wiele opcji i może również korzystać z GPU.

Pylearn polega na Theano i jak wspomniano w drugiej odpowiedzi, korzystanie z biblioteki jest dość skomplikowane, dopóki go nie zdobędziesz. W międzyczasie sugerowałbym skorzystanie z Theanets. Jest również zbudowany na szczycie Theano, ale jest znacznie łatwiejszy w obsłudze. Może to prawda, że ​​nie ma wszystkich funkcji Pylearn, ale do podstawowej pracy jest wystarczający. Jest to również oprogramowanie typu open source, więc jeśli się odważysz, możesz dodawać niestandardowe sieci w locie. EDYCJA: grudzień 2015 r. Ostatnio zacząłem używać Keras. Jest to nieco niższy poziom niż Theanets, ale znacznie mocniejszy. Do podstawowych testów odpowiedni jest Theanets. Ale jeśli chcesz przeprowadzić badania w dziedzinie ANN, Keras jest znacznie bardziej elastyczny. Dodatkowo Keras może używać Tensorflow jako zaplecza.

Wydajne dynamiczne grupowanie

Mam zestaw punktów danych z przedziału jednostkowego (tj. 1-wymiarowy zbiór danych z wartościami liczbowymi). Otrzymuję dodatkowe punkty danych online, a ponadto wartość niektórych punktów danych może zmieniać się dynamicznie. Szukam idealnego algorytmu grupowania, który

może skutecznie rozwiązać te problemy. Wiem, że sekwencyjne grupowanie k-średnich radzi sobie z dodawaniem nowych instancji i przypuszczam, że przy niewielkich modyfikacjach może działać z dynamicznymi wartościami instancji (tj. Najpierw pobiera zmodyfikowaną instancję z odpowiedniego klastra, następnie aktualizuje średnią klastra i na koniec podaje zmodyfikowana instancja jako dane wejściowe do algorytmu, tak jak dodanie niewidocznej instancji). Moim problemem związanym z użyciem algorytmu k-średnich jest wymóg podania liczby klastrów jako danych wejściowych. Wiem, że pokonują inne algorytmy grupowania (GA, MST, metody hierarchiczne itp.) Pod względem złożoności czasowo-przestrzennej. Szczerze mówiąc, nie jestem pewien, ale może uda mi się użyć jednego z wyżej wymienionych algorytmów. Nawet jeśli moje zbiory danych są stosunkowo duże, istnienie jednego wymiaru sprawia, że ​​zastanawiam się. Dokładniej, typowy mój przypadek testowy zawierałby około 10 000-200 1-wymiarowych punktów danych. Chciałbym zakończyć grupowanie najlepiej w ciągu sekundy. Zakłada się, że dynamiczne zmiany punktów wartości są płynne, tj. Stosunkowo niewielkie. Dlatego wysoce preferowana jest możliwość korzystania z istniejących rozwiązań (tj. Możliwość kontynuowania klastrowania na istniejącym, gdy wartość jest zmieniana lub dodawana jest nowa). Podsumowując:

Czy możesz pomyśleć o algorytmie, który zapewni najlepszy punkt między wydajnością obliczeniową a dokładnością klastrów wrt. problem zdefiniowany powyżej?

Czy jest jakaś fajna heurystyka dla algorytmu k-średnich do automatycznego obliczania wartości K wcześniej?

Myślę, że hierarchiczne grupowanie byłoby bardziej wydajne w twoim przypadku (z jednym wymiarem). W zależności od zadania możesz zaimplementować coś takiego: Posiadanie N punktów danych di z ich 1-wymiarową wartością x <sup> i </sup>:

  1. Sortuj punkty danych na podstawie ich wartości x <sup> i </sup>.
  2. Oblicz odległości między sąsiednimi punktami danych (odległości N-1). Każdej odległości należy przypisać parę oryginalnych punktów danych (d <sup> i </sup>, d <sup> j </sup>).
  3. Posortuj odległości w porządku malejącym, aby wygenerować listę par punktów danych (d <sup> i </sup>, d <sup> j </sup>), zaczynając od najbliższej.
  4. Iteracyjnie łącz punkty danych (d <sup> i </sup>, d <sup> i </sup>) w klastry, zaczynając od początku listy (najbliższa para). (W zależności od aktualnego stanu di i dj, połączenie ich oznacza: (a) utworzenie nowego klastra dla dwóch nieklastrowanych punktów danych, (b) dodanie punktu danych do istniejącego klastra oraz (c) połączenie dwóch klastrów.)
  5. Przestań się łączyć, jeśli odległość przekracza pewien próg.
  6. Utwórz pojedyncze klastry dla punktów danych, które nie dostały się do klastrów.

Ten algorytm implementuje grupowanie pojedynczych powiązań. Można go łatwo dostroić, aby wdrożyć przeciętne połączenie. Pełne powiązanie będzie mniej wydajne, ale być może łatwiejsze dadzą dobre wyniki w zależności od danych i zadania. Uważam, że dla 200 000 punktów danych musi to zająć mniej niż sekundę, jeśli używasz odpowiednich struktur danych dla powyższych operacji.

Jak wybrać cechy sieci neuronowej?

Wiem, że nie ma jednoznacznej odpowiedzi na to pytanie, ale załóżmy, że mam ogromną sieć neuronową z dużą ilością danych i chcę dodać nową funkcję na wejściu. „Najlepszym” sposobem byłoby przetestowanie sieci z nową funkcją i zobaczenie wyników, ale czy istnieje metoda sprawdzenia, czy funkcja JEST NIEPRAWDOPODOBNIE pomocna? Podobnie jak miary korelacji (http://www3.nd.edu/~mclark19/learn/CorrelationComparison.pdf) itp.?

Bardzo silna korelacja między nową funkcją a istniejącą funkcją jest dość dobrym znakiem, że nowa funkcja dostarcza niewiele nowych informacji. Prawdopodobnie preferowana jest niska korelacja między nową funkcją a istniejącymi funkcjami. Silna korelacja liniowa między nową cechą a przewidywaną zmienną to dobry znak, że nowa funkcja będzie wartościowa, ale brak wysokiej korelacji nie jest konieczny oznaką słabej cechy, ponieważ sieci neuronowe nie są ograniczone do kombinacji liniowych zmiennych. Jeśli nowy element został utworzony ręcznie z kombinacji istniejących elementów, rozważ pominięcie go. Piękno sieci neuronowych polega na tym, że wymagana jest niewielka inżynieria funkcji i wstępne przetwarzanie – zamiast tego funkcje są uczone przez warstwy pośrednie. O ile to możliwe, preferuj funkcje uczenia się od ich projektowania.

Jak zwiększyć dokładność klasyfikatorów?

Używam przykładu OpenCV letter_recog.cpp do eksperymentowania na losowych drzewach i innych klasyfikatorach. Ten przykład zawiera implementacje sześciu klasyfikatorów – drzewa losowe, wzmocnienie, MLP, kNN, naiwny Bayes i SVM. Używany jest zestaw danych rozpoznawania liter UCI z 20000 instancjami i 16 funkcjami, które dzielę na pół do celów szkoleniowych i testowych. Mam doświadczenie z SVM więc szybko ustawiłem jego błąd rozpoznawania na 3,3%. Po kilku eksperymentach otrzymałem:

Rozpoznawanie liter UCI:

*RTrees – 5.3%

*Boost – 13%

*MLP – 7.9%

*kNN(k=3) – 6.5%

*Bayes – 11.5%

*SVM – 3.3%

Zastosowane parametry:

*RTrees – max_num_of_trees_in_the_forrest=200, max_depth=20,

min_sample_count=1

*Boost – boost_type=REAL, weak_count=200, weight_trim_rate=0.95, max_depth=7

*MLP – method=BACKPROP, param=0.001, max_iter=300 (default values – too slow to experiment)

*kNN(k=3) – k=3

*Bayes – none

*SVM – RBF kernel, C=10, gamma=0.01

Następnie użyłem tych samych parametrów i przetestowałem na zestawach danych Digits i MNIST, najpierw wyodrębniając cechy gradientu (rozmiar wektora 200 elementów):

Cyfry:

*RTrees – 5.1%

*Boost – 23.4%

*MLP – 4.3%

*kNN(k=3) – 7.3%

*Bayes – 17.7%

*SVM – 4.2%

MNIST:

*RTrees – 1.4%

*Boost – out of memory

*MLP – 1.0%

*kNN(k=3) – 1.2%

*Bayes – 34.33%

*SVM – 0.6%

Jestem nowy dla wszystkich klasyfikatorów z wyjątkiem SVM i kNN, dla tych dwóch mogę powiedzieć, że wyniki wydają się dobre. A co z innymi? Spodziewałem się więcej po losowych drzewach, na MNIST kNN daje lepszą dokładność, jakieś pomysły, jak ją zwiększyć? Boost i Bayes dają bardzo niską celność. Na koniec chciałbym użyć tych klasyfikatorów do stworzenia systemu z wieloma klasyfikatorami. Jakakolwiek rada?

Redukcja wymiarowości

Inną ważną procedurą jest porównanie współczynników błędów w szkoleniu i zestawie danych testowych, aby sprawdzić, czy jesteś nadmiernie dopasowany (z powodu „przekleństwa wymiarowości”). Na przykład, jeśli poziom błędów w zestawie danych testowych jest znacznie większy niż błąd w zestawie danych uczących, byłby to jeden wskaźnik. W takim przypadku możesz wypróbować techniki redukcji wymiarowości, takie jak PCA lub LDA. Jeśli jesteś zainteresowany, o PCA, LDA i kilku innych technikach pisałem tutaj: http://sebastianraschka.com/index.html#machine_learning oraz w moim repozytorium GitHub tutaj:

https://github.com/rasbt/pattern_classification

Walidacja krzyżowa

Możesz również przyjrzeć się technikom walidacji krzyżowej, aby ocenić wydajność swoich klasyfikatorów w bardziej obiektywny sposób

Spodziewałem się więcej po losowych drzewach:

* W przypadku lasów losowych, zwykle dla funkcji N, funkcje sqrt (N) są używane do każdej konstrukcji drzewa decyzyjnego. Ponieważ w twoim przypadku N = 20, możesz spróbować ustawić max_depth (liczbę funkcji podrzędnych do skonstruowania każdego drzewa decyzyjnego) na 5.

* Zamiast drzew decyzyjnych zaproponowano i oceniono modele liniowe jako estymatory bazowe w lasach losowych, w szczególności wielomianowej regresji logistycznej i naiwnym modelu Bayesa. Może to poprawić twoją dokładność.

Na MNIST kNN daje lepszą dokładność, jakieś pomysły, jak ją zwiększyć? * Spróbuj z wyższą wartością K (powiedzmy 5 lub 7). Wyższa wartość K dostarczyłaby bardziej wspierających dowodów na temat etykiety klasy punktu.

* Możesz uruchomić PCA lub Linear Discriminant Analysis Fishera przed uruchomieniem najbliższego sąsiada. W ten sposób możesz potencjalnie pozbyć się skorelowanych cech podczas obliczania odległości między punktami, a zatem twoi sąsiedzi k byliby bardziej odporni. Wypróbuj różne wartości K dla różnych punktów w oparciu o wariancję odległości między sąsiadami K.

Grupowanie współrzędnych lokalizacji geograficznej (szer., Długie pary)

Jakie jest właściwe podejście i algorytm klastrowania do klastrowania geolokalizacji? Używam następującego kodu do grupowania współrzędnych geolokalizacji:

importuj numpy jako np

import matplotlib.pyplot as plt

z scipy.cluster.vq import kmeans2, wybielić

współrzędne = np.array ([

[szer. długa],

[szer. długa],

[lat, long]

])

x, y = kmeans2 (wybiel (współrzędne), 3, iter = 20)

plt.scatter (współrzędne [:, 0], współrzędne [:, 1], c = y);

plt.show ()

Czy słuszne jest używanie Kmeans do grupowania lokalizacji, skoro wykorzystuje odległość euklidesową, a nie formułę Haversine’a jako funkcję odległości?

W tym przypadku środki K powinny mieć rację. Ponieważ k-średnie próbuje grupować się wyłącznie na podstawie odległości euklidesowej między obiektami, otrzymasz z powrotem skupiska lokalizacji, które są blisko siebie. Aby znaleźć optymalną liczbę skupień, możesz spróbować wykonać „kolanowy” wykres wnętrza

suma grupowa odległości kwadratowej. Może to być pomocne (http://nbviewer.ipython.org/github/nborwankar/LearnDataScience/blob/master/notebooks/D3.%20KMeans%

20Clustering% 20Analysis.ipynb)

K-średnie nie są tutaj najwłaściwszym algorytmem. Powodem jest to, że k-średnie są zaprojektowane tak, aby minimalizować wariancję. To jest oczywiście pojawiające się z punktu widzenia statystyki i przetwarzania sygnałów, ale dane nie są „liniowe”. Ponieważ twoje dane są w formacie szerokości i długości geograficznej, powinieneś użyć algorytmu, który może obsługiwać dowolne funkcje odległości, w szczególności funkcje odległości geodezyjnej. Popularnymi przykładami są klastry hierarchiczne, PAM, CLARA i DBSCAN. Problemy k-średnich są łatwe do zauważenia, gdy weźmie się pod uwagę punkty bliskie zawinięcia + -180 stopni. Nawet jeśli zhakowałeś k-oznacza, aby użyć odległości Haversine, w kroku aktualizacji, gdy ponownie obliczy średnią, wynik będzie źle wkręcony. W najgorszym przypadku k-średnie nigdy się nie zbiegną!

t-SNE Implementacja Pythona: dywergencja Kullbacka-Leiblera

t-SNE, działa poprzez stopniowe zmniejszanie dywergencji Kullbacka-Leiblera (KL), aż do spełnienia określonego warunku. Twórcy t-SNE sugerują użycie dywergencji KL jako kryterium wydajności dla wizualizacji: można porównać rozbieżności Kullbacka-Leiblera, które zgłasza t-SNE. Całkiem dobrze jest dziesięciokrotnie uruchomić t-SNE i wybrać rozwiązanie o najniższej rozbieżności KL [2]. Wypróbowałem dwie implementacje t-SNE:

* python: sklearn.manifold.TSNE ().

* R: tsne, z biblioteki (tsne).

Obie te implementacje, gdy jest ustawiona gadatliwość, wyświetlają błąd (dywergencja Kullbacka-Leiblera) dla każdej iteracji. Jednak nie pozwalają użytkownikowi uzyskać tych informacji, co wydaje mi się nieco dziwne.

Na przykład kod:

importuj numpy jako np

from sklearn.manifold import TSNE

X = np.array ([[0, 0, 0], [0, 1, 1], [1, 0, 1], [1, 1, 1]])

model = TSNE (n_components = 2, verbose = 2, n_iter = 200)

t = model.fit_transform (X)

produkuje:

[t-SNE] Obliczanie odległości parami…

[t-SNE] Obliczone prawdopodobieństwa warunkowe dla próby 4/4

[t-SNE] Średnia sigma: 1125899906842624,000000

[t-SNE] Iteracja 10: błąd = 6,7213750, norma gradientu = 0,0012028

[t-SNE] Iteracja 20: błąd = 6,7192064, norma gradientu = 0,0012062

[t-SNE] Iteracja 30: błąd = 6,7178683, norma gradientu = 0,0012114…

[t-SNE] Błąd po 200 iteracjach: 0,270186

O ile rozumiem, 0,270186 powinno być dywergencją KL. Jednak nie mogę uzyskać tych informacji, ani z modelu, ani z t (co jest prostym numpy.ndarray). Aby rozwiązać ten problem, mógłbym: i) obliczyć dywergencję KL samodzielnie, ii) zrobić coś paskudnego w Pythonie, aby przechwycić i przeanalizować wyjście funkcji TSNE (). Jednakże, ja)

byłoby całkiem głupie ponowne obliczenie dywergencji KL, skoro TSNE () już ją obliczyło, ii) byłoby nieco nietypowe pod względem kodu.

Czy masz jakieś inne sugestie? Czy istnieje standardowy sposób uzyskania tych informacji za pomocą tej biblioteki? Wspomniałem, że wypróbowałem bibliotekę tsne w języku R, ale wolałbym, aby odpowiedzi koncentrowały się na implementacji Python sklearn.

Źródło TSNE w scikit-learn jest w czystym Pythonie. Metoda Fit fit_transform () w rzeczywistości wywołuje prywatną funkcję _fit (), która następnie wywołuje prywatną funkcję _tsne (). Ta funkcja _tsne () ma lokalny błąd zmiennej, który jest drukowany na końcu dopasowania. Wygląda na to, że możesz łatwo zmienić jedną lub dwie linie kodu źródłowego, aby to mieć  wartość zwróconą do fit_transform ().

Dlaczego podczas prognozowania powinienem przejmować się danymi sezonowymi?

Mam czas z godzinowym zużyciem gazu. Chcę użyć ARiMR / ARIMA do prognozowania zużycia na następną godzinę na podstawie poprzedniej. Dlaczego powinienem analizować / znaleźć sezonowość (z dekompozycją sezonową i trendową za pomocą Loess (STL)?)?

 „Ponieważ jest tam”.

Dane mają charakter sezonowy. Więc modelujesz to. Dane mają trend. Więc modelujesz to. Może dane są skorelowane z liczbą plam słonecznych. Więc modelujesz to. Ostatecznie masz nadzieję, że nic nie zostanie do modelowania poza nieskorelowanym szumem losowym. Ale myślę, że spieprzyłeś tutaj obliczenia STL. Twoje reszty wyraźnie nie są nieskorelowane seryjnie. Podejrzewam raczej, że nie powiedziałeś funkcji, że Twoja „sezonowość” to cykl 24-godzinny, a nie roczny. Ale hej, nie podałeś nam żadnego kodu ani danych, więc tak naprawdę nie mamy pojęcia, co zrobiłeś, prawda? Jak myślisz, co w ogóle oznacza tutaj „sezonowość”? Masz jakiś pomysł? Twoje dane wydają się mieć trzy szczyty co 24 godziny. Naprawdę? Czy ten „gaz” = „benzyna” = „benzyna” czy gaz w jakimś układzie ogrzewania / zasilania elektrycznego? Tak czy inaczej, jeśli wiesz a priori, że istnieje 8-godzinny cykl lub 8-godzinny cykl oprócz 24-godzinnego cyklu, który wygląda na bardzo wysoką częstotliwość 1 lub 2-godzinny cykl, umieść to w swoim modelu. Właściwie nawet nie mówisz, jaka jest twoja oś x, więc może jej dni, a wtedy dopasowałbym cykl dzienny, tygodniowy, a potem roczny. Ale biorąc pod uwagę, jak to wszystko zmienia się w czasie = około 85, nie spodziewałbym się, że model poradzi sobie dobrze po obu stronach.

Ze statystykami (a to jest to, przepraszam, że cię zawiodłem, ale nie jesteś jeszcze naukowcem zajmującym się danymi), nie mówisz po prostu robotycznie: „I… Teraz… Dopasuj…… Model S TL…. ”. Patrzysz na swoje dane, próbujesz je zrozumieć, a następnie proponujesz model, dopasowujesz go, testujesz i wykorzystujesz parametry, które wyciąga z danych. Częścią tego jest dopasowanie cyklicznych wzorców sezonowych.

Zalety AUC w porównaniu ze standardową dokładnością

Zacząłem patrzeć na obszar pod krzywą (AUC) i jestem trochę zdezorientowany co do jego użyteczności. Kiedy po raz pierwszy mi wyjaśniono, AUC wydawało się świetną miarą wydajności, ale w moich badaniach odkryłem, że niektórzy twierdzą, że jego przewaga jest głównie marginalna, ponieważ najlepiej nadaje się do łapania “ szczęśliwych ” modeli z wysokimi standardowymi pomiarami dokładności i niskim AUC . Czy powinienem zatem unikać polegania na wartości AUC przy walidacji modeli, czy też kombinacja byłaby najlepsza? Dzięki za całą twoją pomoc.

AUC i dokładność to całkiem różne rzeczy. AUC dotyczy klasyfikatorów binarnych, które wewnętrznie mają pewne pojęcie o progu decyzyjnym. Na przykład regresja logistyczna zwraca wartość dodatnią / ujemną w zależności od tego, czy funkcja logistyczna jest większa / mniejsza niż próg, zwykle domyślnie 0,5. Kiedy wybierasz swój próg, masz klasyfikator. Musisz wybrać jedną. Dla danego progu można obliczyć dokładność, czyli odsetek prawdziwych pozytywów i negatywów w całym zbiorze danych. AUC mierzy, w jaki sposób prawdziwa dodatnia stopa (przypominanie) i fałszywie dodatnia stawka ulegają zmianie, więc w tym sensie mierzy już coś innego. Co ważniejsze, AUC nie jest funkcją progu. Jest to ocena klasyfikatora, ponieważ próg zmienia się we wszystkich możliwych wartościach. W pewnym sensie jest to szerszy miernik, testujący jakość wewnętrznej wartości, którą klasyfikator generuje, a następnie porównuje z wartością progową. Nie jest to testowanie jakości konkretnego wyboru progu. AUC ma inną interpretację, a to oznacza, że ​​jest to również prawdopodobieństwo, że losowo wybrany pozytywny przykład znajdzie się wyżej niż losowo wybrany negatywny przykład, zgodnie z wewnętrzną wartością klasyfikatora dla przykładów.

AUC można obliczyć, nawet jeśli masz algorytm, który tworzy ranking tylko na przykładach. AUC nie jest obliczalne, jeśli naprawdę masz tylko klasyfikator czarnej skrzynki, a nie taki z wewnętrznym progiem. Zwykle dyktują one, który z nich jest w ogóle dostępny dla danego problemu. Myślę, że AUC jest bardziej wszechstronną miarą, chociaż ma zastosowanie w mniejszej liczbie sytuacji. To nie jest lepsze niż dokładność; to jest inne. Zależy to po części od tego, czy bardziej zależy Ci na prawdziwych wynikach, fałszywie negatywnych wynikach, itp. F-miara bardziej przypomina dokładność w tym sensie, że jest funkcją klasyfikatora i jego ustawienia progowego. Ale mierzy precyzję vs zapamiętywanie (prawdziwie dodatni współczynnik), który nie jest taki sam jak w przypadku obu powyższych.

Statystyka + informatyka = nauka o danych?

Chcę zostać naukowcem danych. Studiowałem statystykę stosowaną (nauki aktuarialne), więc mam świetne podłoże statystyczne (regresja, proces stochastyczny, szeregi czasowe, żeby wymienić tylko kilka). Ale teraz mam zamiar zrobić tytuł magistra w dziedzinie informatyki z inteligentnych systemów. Oto mój plan nauki:

*Nauczanie maszynowe

* Zaawansowane uczenie maszynowe

* Eksploracja danych

*Logika rozmyta

* Systemy rekomendacji

* Rozproszone systemy danych

*Chmura obliczeniowa

* Odkrycie wiedzy

* Business Intelligence

*Wyszukiwanie informacji

* Wydobywanie tekstu

Na koniec, przy całej mojej wiedzy statystycznej i informatycznej, czy mogę nazywać siebie naukowcem danych? czy się mylę?

To zależy od tego, do jakiego rodzaju „nauki o danych” chcesz się dostać. W przypadku podstawowych analiz i raportowania statystyki z pewnością pomogą, ale w przypadku uczenia maszynowego i sztucznej inteligencji będziesz potrzebować kilku dodatkowych umiejętności

* Teoria prawdopodobieństwa – musisz mieć solidne podstawy w zakresie czystego prawdopodobieństwa, aby móc rozłożyć każdy problem, widziany wcześniej lub nie, na zasady probabilistyczne. Statystyka bardzo pomaga w przypadku już rozwiązanych problemów, ale nowe i nierozwiązane problemy wymagają głębokiego zrozumienia prawdopodobieństwa, aby można było zaprojektować odpowiednie techniki.

Teoria informacji – to (w stosunku do statystyki) dziedzina całkiem nowa (choć wciąż licząca dziesiątki lat), najważniejsza praca była autorstwa Shannona, ale jeszcze ważniejsza i często zaniedbywana uwaga w literaturze to praca Hobsona, która dowiodła, że ​​Kullback-Leibler Divergence jest jedyną matematyczną definicją, która naprawdę oddaje pojęcie „miary informacji”. Obecnie podstawą sztucznej inteligencji jest możliwość ilościowego określenia informacji.

Teoria złożoności – dużym problemem, z którym boryka się wielu naukowców zajmujących się danymi, który nie ma solidnego tła w teorii złożoności, jest to, że ich algorytmy nie skalują się lub po prostu zajmują bardzo dużo czasu na dużych danych. Weźmy na przykład PCA, ulubioną odpowiedź wielu ludzi na pytanie podczas rozmowy kwalifikacyjnej „jak zmniejszyć liczbę funkcji w naszym zbiorze danych”, ale nawet jeśli powiesz kandydatowi, że „zbiór danych jest naprawdę bardzo duży”, nadal proponują różne formy PCA, które są O (n ^ 3). Jeśli chcesz się wyróżniać, chcesz być w stanie samodzielnie rozwiązać każdy problem, a NIE rzucać na to rozwiązania z podręcznika, które zostało zaprojektowane na długo, zanim Big Data stało się tak modne. W tym celu musisz zrozumieć, jak długo to trwa, nie tylko teoretycznie, ale praktycznie – jak wykorzystać klaster komputerów do dystrybucji algorytmu lub które struktury danych zajmują mniej pamięci. Umiejętności komunikacyjne – ogromną częścią nauki o danych jest zrozumienie biznesu. Niezależnie od tego, czy chodzi o wynalezienie produktu opartego na nauce o danych, czy o dostarczanie informacji biznesowych opartych na nauce o danych, bardzo ważna jest umiejętność dobrej komunikacji zarówno z kierownikami projektów, jak i produktów, zespołami technicznymi i innymi naukowcami zajmującymi się danymi. Możesz mieć niesamowity pomysł, powiedzmy niesamowite rozwiązanie AI, ale jeśli nie możesz skutecznie (a) komunikować DLACZEGO, co przyniesie firmie zyski, (b) przekonać kolegów, że to zadziała oraz (c) wyjaśnić pracownikom technicznym, jak potrzebujesz ich pomocy w jego budowie, a wtedy to się nie uda.

Naukowiec danych (dla mnie) duży termin parasolowy. Naukowca danych postrzegałbym jako osobę, która potrafi biegle posługiwać się technikami z zakresu eksploracji danych, uczenia maszynowego, klasyfikacji wzorców i statystyki. Jednak terminy te są ze sobą powiązane: uczenie maszynowe jest powiązane z klasyfikacją wzorców, a eksploracja danych nakłada się, jeśli chodzi o znajdowanie wzorców w danych. Wszystkie techniki mają swoje podstawowe zasady statystyczne. Zawsze wyobrażam sobie to jako diagram Venna z dużym przecięciem. Informatyka jest również związana z tymi wszystkimi dziedzinami. Powiedziałbym, że do prowadzenia badań komputerowo-naukowych potrzebne są techniki „nauki o danych”, ale wiedza informatyczna niekoniecznie jest implikowana w „nauce o danych”. Jednak umiejętności programistyczne – postrzegam programowanie i informatykę jako różne zawody, w których programowanie jest bardziej narzędziem służącym do rozwiązywania problemów – są również ważne przy pracy z danymi i przeprowadzaniu analizy danych. Masz naprawdę fajny plan nauki i wszystko ma sens. Ale nie jestem pewien, czy „chcesz” nazywać siebie po prostu „naukowcem danych”, mam wrażenie, że „naukowiec danych” to termin tak niejednoznaczny, że może oznaczać wszystko albo nic. Chcę przekazać, że staniesz się kimś więcej – bardziej „wyspecjalizowanym” – niż „tylko” naukowcem zajmującym się danymi.

Czy powinienem wybrać „zrównoważony” zestaw danych, czy „reprezentatywny” zestaw danych?

Moje zadanie „uczenia maszynowego” polega na oddzieleniu nieszkodliwego ruchu internetowego od szkodliwego ruchu. W prawdziwym świecie większość (powiedzmy 90% lub więcej) ruchu internetowego jest niegroźna. Dlatego poczułem, że powinienem korzystać z podobnego rodzaju danych do trenowania moich modeli. Ale potem natknąłem się na jeden lub dwa artykuły badawcze (w mojej dziedzinie), które wykorzystywały wyważone dane do trenowania modeli, sugerując równą liczbę przypadków nieszkodliwego i złośliwego ruchu. Ogólnie rzecz biorąc, jeśli buduję modele ML, czy powinienem wybrać zestaw danych, który jest reprezentatywny dla rzeczywistego problemu, czy też zbalansowany zestaw danych lepiej nadaje się do budowania modeli (ponieważ niektóre klasyfikatory nie zachowują się dobrze w przypadku nierównowagi klas lub z powodu z innych nieznanych mi przyczyn)? Czy ktoś może rzucić więcej światła na zalety i wady obu wyborów oraz jak zdecydować, na który z nich się zdecydować?

Powiedziałbym, że odpowiedź zależy od twojego przypadku użycia. Na podstawie mojego doświadczenia:

* Jeśli próbujesz zbudować reprezentatywny model – taki, który opisuje dane, a nie musi przewidywać – sugerowałbym użycie reprezentatywnej próbki danych.

* Jeśli chcesz zbudować model predykcyjny, szczególnie taki, który działa dobrze według miary AUC lub kolejności rang i planujesz użyć podstawowego frameworka ML (tj. Drzewo decyzyjne, SVM, Naive Bayes itp.), To sugeruję ramy zbalansowanego zbioru danych. W znacznej części literatury na temat nierównowagi klas stwierdza się, że losowe niedopróbowanie (zmniejszanie próby z klasy większości do rozmiaru klasy mniejszościowej) może prowadzić do wzrostu wydajności.

* Jeśli budujesz model predykcyjny, ale używasz bardziej zaawansowanej struktury (tj. Czegoś, co określa parametry próbkowania poprzez opakowanie lub modyfikację struktury pakowania, która próbkuje do równoważności klas), sugerowałbym ponowne podanie reprezentatywnej próbki i pozwalając algorytmowi zająć się zbilansowaniem danych do treningu.

Myślę, że to zawsze zależy od scenariusza. Korzystanie z reprezentatywnego zestawu danych nie zawsze jest rozwiązaniem. Załóżmy, że zestaw treningowy zawiera 1000 negatywnych przykładów i 20 pozytywnych przykładów. Bez jakiejkolwiek modyfikacji klasyfikatora algorytm będzie miał tendencję do klasyfikowania wszystkich nowych przykładów jako negatywnych. W niektórych scenariuszach jest to w porządku. Jednak w wielu przypadkach koszty braku pozytywnych przykładów są wysokie, więc musisz znaleźć na to rozwiązanie. W takich przypadkach można użyć wrażliwego na koszty algorytmu uczenia maszynowego. Na przykład w przypadku analizy danych z diagnostyki medycznej. Podsumowując: błędy klasyfikacyjne nie mają takiego samego kosztu!

Zawsze istnieje rozwiązanie umożliwiające wypróbowanie obu podejść i zachowanie tego, które maksymalizuje oczekiwane wyniki. W twoim przypadku założyłbym, że wolisz zminimalizować fałszywie ujemne wyniki kosztem fałszywie pozytywnych wyników, więc chcesz odnieść swój klasyfikator do silnego negatywu wcześniejszego i zająć się nierównowagą, zmniejszając liczbę negatywnych przykładów w zestawie uczącym. Następnie oblicz dokładność / rozpoznawalność, czułość / specyficzność lub dowolne kryterium, które Ci odpowiada w pełnym, niezrównoważonym zbiorze danych, aby upewnić się, że nie zignorowałeś znaczącego wzorca występującego w rzeczywistych danych podczas budowania modelu na podstawie zredukowanych danych.

[44][Machine Learning] (2)

Różnica między używaniem RMSE i nDCG do oceny systemów rekomendujących

Jakiego rodzaju miary błędów podają RMSE i nDCG podczas oceny systemu rekomendacji i skąd mam wiedzieć, kiedy stosować jeden nad drugim? Gdybyś mógł podać przykład, kiedy używać każdego z nich, byłoby to również świetne!

nDCG służy do oceny złotej listy rankingowej (zazwyczaj ocenianej przez ludzi) w porównaniu z listą rankingową wyników. Im większa jest korelacja między dwiema listami rankingowymi, tj. Im bardziej podobne są rangi odpowiednich pozycji na obu listach, tym wartość nDCG jest bliższa 1.

RMSE (Root Mean Squared Error) jest zwykle używany do oceny problemów z regresją, w których wynik (przewidywana wartość skalarna) jest porównywany z prawdziwą wartością skalarną wyjściową dla danego punktu danych.

Tak więc, jeśli po prostu rekomendujesz partyturę (na przykład rekomendujesz ocenę filmu), użyj RMSE. Natomiast jeśli polecasz listę pozycji (na przykład listę powiązanych filmów), użyj nDCG.

nDCG jest miernikiem rankingu, a RMSE nim nie jest. W kontekście systemów rekomendujących użyjesz miernika rankingu, gdy twoje oceny są niejawne (np. Przedmiot pominięty a produkt zużyty), a nie jawny (użytkownik podaje rzeczywistą liczbę, a la Netflix).

Wybór wskaźnika uczenia się

Obecnie pracuję nad wdrożeniem Stochastic Gradient Descent (SGD) dla sieci neuronowych za pomocą propagacji wstecznej i chociaż rozumiem jej cel, mam kilka pytań dotyczących wyboru wartości współczynnika uczenia się.

* Czy tempo uczenia się jest powiązane z kształtem gradientu błędu, ponieważ dyktuje on tempo opadania?

* Jeśli tak, w jaki sposób wykorzystujesz te informacje do podjęcia decyzji o wartości?

* Jeśli nie jest to, jakie wartości mam wybrać i jak mam je wybrać?

* Wygląda na to, że chciałbyś mieć małe wartości, aby uniknąć przekroczenia wartości, ale jak wybrać taką, aby nie utknąć na lokalnych minimach lub zbyt długo zejść?

* Czy ma sens posiadanie stałego wskaźnika uczenia się, czy też powinienem użyć jakiejś metryki, aby zmienić jej wartość, gdy zbliżam się do minimum w gradiencie?

W skrócie: Jak wybrać kurs nauki dla SGD?

Poniżej znajduje się bardzo dobra uwaga (strona 12) dotycząca szybkości uczenia się w sieciach neuronowych (propagacja wsteczna) autorstwa Andrew Ng. Znajdziesz szczegółowe informacje dotyczące współczynnika uczenia się. http://web.stanford.edu/class/cs294a/sparseAutoencoder_2011new.pdf

Jeśli chodzi o Twój czwarty punkt, masz rację, że zwykle trzeba wybrać „zrównoważony” współczynnik uczenia się, który nie powinien ani przekraczać, ani zbiegać zbyt wolno. Można wykreślić współczynnik uczenia się w.r.t. zejście funkcji kosztu w celu zdiagnozowania / dostrojenia. W praktyce Andrew zwykle używa algorytmu L-BFGS (wspomnianego na stronie 12), aby uzyskać „dostatecznie dobry” współczynnik uczenia się.

Szukam na przykład stosów infrastruktury / przepływów pracy / potoków

Próbuję zrozumieć, jak wszystkie komponenty „dużych zbiorów danych” współgrają ze sobą w przypadku użycia w świecie rzeczywistym, np. hadoop, monogodb / nosql, storm, kafka,… Wiem, że to dość szeroka gama narzędzi używanych do różnych typów, ale chciałbym dowiedzieć się więcej o ich interakcji w aplikacjach, np. myślenie maszynowe dla aplikacji, aplikacji internetowej, sklepu internetowego. Mam odwiedzających / sesję, dane transakcji itp. I przechowuję je; ale jeśli chcę wydawać zalecenia w locie, nie mogę uruchamiać powolnej mapy / zmniejszać zadań związanych z tym w dużej bazie danych dzienników, które mam. Gdzie mogę dowiedzieć się więcej o aspektach infrastruktury? Myślę, że większość narzędzi mogę używać samodzielnie, ale podłączanie ich do siebie wydaje się sztuką samą w sobie. Czy są dostępne publiczne przykłady / przypadki użycia itp.? Rozumiem, że poszczególne potoki silnie zależą od przypadku użycia i użytkownika, ale tylko przykłady będą dla mnie bardzo przydatne.

Aby zrozumieć różne sposoby integracji uczenia maszynowego z aplikacjami produkcyjnymi, myślę, że warto przyjrzeć się projektom open source i artykułom / postom na blogach firm opisujących ich infrastrukturę. Wspólnym motywem, który mają te systemy, jest oddzielenie uczenia modelu od aplikacji modelowej. W systemach produkcyjnych aplikacja modelu musi być szybka, rzędu 100s ms, ale istnieje większa swoboda w tym, jak często należy aktualizować dopasowane parametry modelu (lub quivalent).

Ludzie korzystają z szerokiej gamy rozwiązań do szkolenia i wdrażania modeli:

* Zbuduj model, a następnie wyeksportuj go i wdróż za pomocą PMML

-AirBnB opisuje szkolenie modelu w R / Python i wdrażanie .Modele PMML za pośrednictwem OpenScoring.

-Pattern. Wzorzec to projekt związany z kaskadowaniem, który może wykorzystywać język PMML i wdrażać modele predykcyjne.

* Zbuduj model w MapReduce i uzyskaj dostęp do wartości w niestandardowym systemie

-Conjecture to projekt open source firmy Etsy, który umożliwia szkolenie modeli za pomocą Scalding, łatwiejsze w użyciu opakowanie Scala wokół MapReduce i wdrażanie za pośrednictwem PHP.

-Kiji to projekt open source firmy WibiData, który umożliwia ocenianie modeli (aplikacji) w czasie rzeczywistym, a także funkcjonalność utrwalania danych użytkownika i modeli szkoleniowych na tych danych za pośrednictwem skalowania.

Skorzystaj z systemu online, który pozwala na ciągłą aktualizację parametrów modelu.

-Google wydało świetny artykuł na temat wspólnego filtrowania online, które wdrożyli w celu radzenia sobie z rekomendacjami w Google News.

Jedno z najbardziej szczegółowych i jasnych wyjaśnień dotyczących konfigurowania złożonego potoku analitycznego pochodzi od ludzi z Twitch.

Podają szczegółowe motywacje dotyczące wyboru architektury gromadzenia, transportu, koordynacji, przetwarzania, przechowywania i wykorzystywania ich danych. Fascynująca lektura!

Airbnb i Etsy niedawno opublikowały szczegółowe informacje o swoich przepływach pracy.

Jakie są implikacje dla trenowania zbioru drzew z wysokim stronniczym  zbiorem danych?

Mam wysoce stronniczy binarny zbiór danych – mam 1000 razy więcej przykładów klasy negatywnej niż pozytywnej. Chciałbym wyszkolić zbiór drzew (taki jak Extra Random Trees lub Random Forest) na tych danych, ale trudno jest stworzyć zestawy danych szkoleniowych, które zawierają wystarczającą liczbę przykładów pozytywnych klas. Jakie byłyby konsekwencje zastosowania metody losowania warstwowego w celu znormalizowania liczby pozytywnych i negatywnych przykładów? Innymi słowy, czy złym pomysłem jest, na przykład, sztuczne zawyżanie (przez ponowne próbkowanie) liczby pozytywnych przykładów klas w zbiorze uczącym?

Tak, to problematyczne. Jeśli przesadzisz mniejszość, ryzykujesz nadmiernym dopasowaniem. Jeśli podpróbujesz większość, ryzykujesz pominięciem aspektów klasy większości. Próbkowanie warstwowe jest równoważne przypisywaniu niejednolitych kosztów błędnej klasyfikacji. Alternatywy:

(1) Niezależne próbkowanie kilku podzbiorów z klasy większości i tworzenie wielu klasyfikatorów poprzez łączenie każdego podzbioru ze wszystkimi danymi klas mniejszości, jak sugeruje odpowiedź z @Debasis i opisano w tym artykule EasyEnsemble,

(2) SMOTE (Synthetic Minority Oversampling Technique) lub SMOTEBoost (łączące SMOTE ze wzmocnieniem) w celu stworzenia syntetycznych instancji klasy mniejszościowej poprzez tworzenie najbliższych sąsiadów w przestrzeni funkcji. SMOTE jest zaimplementowany w R w pakiecie DMwR.

Poleciłbym szkolenie na bardziej zrównoważonych podzbiorach danych. Trenowanie losowego lasu na zestawach losowo wybranych pozytywnych przykładów z podobną liczbą próbek negatywnych. W szczególności, jeśli cechy rozróżniające wykazują dużą zmienność, będzie to dość skuteczne i pozwoli uniknąć nadmiernego dopasowania. Jednak w rozwarstwieniu ważne jest, aby znaleźć równowagę, ponieważ nadmierne dopasowanie może stać się problemem niezależnie od tego. Sugerowałbym, aby zobaczyć, jak model radzi sobie z całym zbiorem danych, a następnie stopniowo zwiększać stosunek próbek pozytywnych do negatywnych, zbliżając się do równego stosunku, i wybierać ten, który maksymalizuje miernik wydajności na niektórych reprezentatywnych danych. Ten artykuł wydaje się dość istotny ttp: //statistics.berkeley.edu/sites/default/files/techreports/

666.pdf mówi o ważonym Losowym Lesie, który w większym stopniu penalizuje błędną klasyfikację klasy mniejszości.

Szybkim, łatwym i często skutecznym sposobem podejścia do tej nierównowagi byłoby losowe podpróbkowanie większej klasy (która w twoim przypadku jest klasą ujemną), przeprowadzenie klasyfikacji N wiele razy ze składnikami z dwóch klas (jednej pełnej, a drugiej podpróbka) i podają średnie wartości metryki, przy czym średnia jest obliczana na podstawie N (powiedzmy 1000) iteracji. Bardziej metodycznym podejściem byłoby wykonanie algorytmu Mapping Convergence (MC), który obejmuje identyfikację podzbioru silnie ujemnych próbek za pomocą jednoklasowego klasyfikatora, takiego jak OSVM lub SVDD, a następnie iteracyjne wykonanie klasyfikacji binarnej zbioru silnie negatywnych i pozytywnych próbek.

Czy GLM to model statystyczny czy uczenia maszynowego?

Myślałem, że uogólniony model liniowy (GLM) będzie uważany za model statystyczny, ale znajomy powiedział mi, że niektóre artykuły klasyfikują go jako technikę uczenia maszynowego. Który z nich jest prawdziwy (lub bardziej precyzyjny)? Wszelkie wyjaśnienia będą mile widziane

GLM jest absolutnie modelem statystycznym, ale modele statystyczne i techniki uczenia maszynowego nie wykluczają się wzajemnie. Ogólnie statystyki bardziej dotyczą wnioskowania o parametrach, podczas gdy w uczeniu maszynowym przewidywanie jest ostatecznym celem.

Jeśli chodzi o przewidywanie, statystyki i nauki o uczeniu maszynowym zaczęły rozwiązywać ten sam problem z różnych perspektyw. Zasadniczo statystyka zakłada, że ​​dane zostały wygenerowane przez dany model stochastyczny. Zatem z perspektywy statystycznej zakłada się model i przy różnych założeniach, błędy są traktowane, a parametry modelu i inne pytania są wywnioskowane. Uczenie maszynowe pochodzi z perspektywy informatyki. Modele są algorytmiczne i zwykle wymaga się bardzo niewielu założeń dotyczących danych. Pracujemy z przestrzenią hipotez i błędem uczenia się. Najlepszy opis uczenia maszynowego, jaki znalazłem, znajduje się w książce Toma Mitchella zatytułowanej Machine Learning. Aby uzyskać bardziej wyczerpujący i kompletny pomysł dotyczący dwóch kultur, możesz przeczytać artykuł Leo Broimana zatytułowany Modelowanie statystyczne: dwie kultury Jednak należy dodać, że nawet jeśli te dwie nauki zaczynały z różnych perspektyw, teraz obie z nich dzielą uczciwe ilość powszechnej wiedzy i technik. Dlaczego, ponieważ problemy były takie same, ale narzędzia były inne. Więc teraz uczenie maszynowe jest głównie traktowane z perspektywy statystycznej (patrz książka Hastie, Tibshirani, Friedman The Elements of Statistical Learning from a machine

punkt widzenia uczenia się z potraktowaniem statystycznym i być może książka Kevina P. Murphy’ego Machine Learning: A probabilistyczna perspektywa, by wymienić tylko kilka z najlepszych dostępnych obecnie książek). Nawet historia rozwoju tej dziedziny pokazuje korzyści płynące z tego połączenia

perspektywy. Opiszę dwa wydarzenia. Pierwszym jest stworzenie drzew CART, które zostało stworzone przez Breimana na solidnym tle statystycznym. Mniej więcej w tym samym czasie Quinlan opracował ID3, C45, See5 i tak dalej, pakiet drzew decyzyjnych z bardziej informatycznym zapleczem. Teraz zarówno te rodziny drzew, jak i metody zespołowe, takie jak worki i lasy, stają się całkiem podobne.

Druga historia dotyczy wzmocnienia. Początkowo zostały opracowane przez Freunda i Shapire’a, kiedy odkryli AdaBoost. Wybory dotyczące projektowania AdaBoost były dokonywane głównie z perspektywy obliczeniowej. Nawet autorzy nie rozumieli dobrze, dlaczego to działa.

Dopiero 5 lat później Breiman (ponownie!) Opisał model adaboost z perspektywy statystycznej i wyjaśnił, dlaczego to działa. Od tego czasu różni wybitni naukowcy, z oboma typami doświadczeń, dalej rozwijali te pomysły, prowadząc do Plejad algorytmów wzmacniających, takich jak zwiększanie logistyczne, zwiększanie gradientowe, łagodne zwiększanie i tak dalej. Trudno teraz myśleć o zwiększaniu bez solidnego tła statystycznego. GLM to rozwój statystyczny. Jednak nowe metody Bayesa umieszczają ten algorytm również w środowisku uczenia maszynowego. Dlatego uważam, że oba twierdzenia mogą być słuszne, ponieważ interpretacja i sposób traktowania tego, jak to działa, mogą być różne.

Oprócz odpowiedzi Bena subtelne rozróżnienie między modelami statystycznymi a modelami uczenia maszynowego polega na tym, że w modelach statystycznych przed utworzeniem modelu wyraźnie decydujesz o strukturze równania wyjściowego. Model jest zbudowany w celu obliczenia parametrów / współczynników.

Weźmy na przykład model liniowy lub GLM,

y = a1x1 + a2x2 + a3x3

Twoje zmienne niezależne to x1, x2, x3, a współczynniki do określenia to a1, a2, a3. W ten sposób definiujesz strukturę swojego równania przed zbudowaniem modelu i obliczasz a1, a2, a3. Jeśli uważasz, że y jest w jakiś sposób skorelowane z x2 w sposób nieliniowy, możesz spróbować czegoś takiego.

y = a1x1 + a2 (x2) ^ 2 + a3x3.

W ten sposób wprowadzasz ograniczenie w zakresie struktury wyjściowej. Z natury modele statystyczne są modelami liniowymi, chyba że jawnie zastosujesz transformacje, takie jak sigmoida lub jądro, aby uczynić je nieliniowymi (GLM i SVM). W przypadku modeli uczenia maszynowego rzadko określa się strukturę wyników, a algorytmy, takie jak drzewa decyzyjne, są z natury nieliniowe i działają wydajnie. W przeciwieństwie do tego, co zauważył Ben, modele uczenia maszynowego to nie tylko przewidywanie, lecz także klasyfikacja, regresja itp., Które można wykorzystać do prognozowania, które są również wykonywane przez różne modele statystyczne.

Word2Vec do rozpoznawania nazwanych jednostek

Chcę skorzystać z implementacji word2vec Google, aby zbudować system rozpoznawania jednostek o określonej nazwie. Słyszałem, że rekurencyjne sieci neuronowe z wsteczną propagacją przez strukturę dobrze nadają się do zadań rozpoznawania nazwanych jednostek, ale nie udało mi się znaleźć przyzwoitej implementacji ani przyzwoitego samouczka dla tego typu modelu. Ponieważ pracuję z nietypowym korpusem, standardowe narzędzia NER w NLTK i podobne działały bardzo słabo i wygląda na to, że będę musiał wyszkolić własny system. Krótko mówiąc, jakie zasoby są dostępne dla tego rodzaju problemu? Czy jest dostępna standardowa rekurencyjna implementacja sieci neuronowej?

Zamiast „rekurencyjnych sieci neuronowych z propagacją wsteczną” można rozważyć podejście zastosowane przez Frantziego i in. glin. w National Center for Text Mining (NaCTeM) na University of Manchester for Termine (patrz: http://www.nactem.ac.uk/index.php i http://personalpages.manchester.ac.uk/staff/sophia. ananiadou / IJODL2000.pdf) Zamiast głębokich sieci neuronowych „łączą informacje językowe i statystyczne”. Dwie ostatnie publikacje wykorzystują architekturę głębokiego uczenia o nazwie CharWNN, aby rozwiązać ten problem. CharWNN został po raz pierwszy użyty do uzyskania najnowocześniejszych wyników (bez ręcznie wykonanych funkcji) w tagowaniu części mowy (POS) w korpusie angielskim. Drugi artykuł tego samego autora wykorzystuje tę samą (lub podobną) architekturę do przewidywania, czy słowo należy do 10 klas nazwanych jednostek, z widocznymi wynikami najnowszej wiedzy.

Jakiego modelu statystycznego należy użyć, aby przeanalizować prawdopodobieństwo, że pojedyncze zdarzenie wpłynęło na dane dotyczące zmian w czasie.

Próbuję znaleźć formułę, metodę lub model do analizy prawdopodobieństwa, że ​​określone zdarzenie wpłynęło na niektóre dane dotyczące zmian w czasie. Trudno mi się dowiedzieć, czego szukać w Google. Oto przykładowy scenariusz: Wyobraź sobie, że jesteś właścicielem firmy, która ma średnio 100 klientów dziennie. Pewnego dnia decydujesz, że chcesz zwiększyć liczbę klientów przychodzących codziennie do Twojego sklepu, więc robisz szalony wyczyn przed sklepem, aby zwrócić na siebie uwagę. W ciągu następnego tygodnia widzisz średnio 125 klientów dziennie. W ciągu następnych kilku miesięcy ponownie decydujesz, że chcesz zdobyć więcej klientów i być może utrzymać je nieco dłużej, więc próbujesz innych przypadkowych rzeczy, aby przyciągnąć więcej klientów do swojego sklepu. Niestety, nie jesteś najlepszym marketerem, a niektóre z twoich taktyk mają niewielki lub żaden wpływ, a inne mają nawet negatywny wpływ.

Jakiej metodologii mogę użyć do określenia prawdopodobieństwa, że ​​jedno zdarzenie wpłynie pozytywnie lub negatywnie na liczbę klientów, którzy przychodzą do sklepu? W pełni zdaję sobie sprawę, że korelacja niekoniecznie oznacza związek przyczynowy, ale jakich metod mogę użyć, aby określić prawdopodobny wzrost lub spadek codziennego spaceru klienta po określonym wydarzeniu? Nie jestem zainteresowany analizowaniem, czy istnieje korelacja między twoimi próbami zwiększenia liczby klientów przychodzących, ale raczej, czy jedno zdarzenie, niezależne od wszystkich innych, miało wpływ.

Zdaję sobie sprawę, że ten przykład jest dość wymyślny i uproszczony, więc podam również krótki opis rzeczywistych danych, których używam:

Próbuję określić wpływ, jaki dana agencja marketingowa wywiera na witrynę swojego klienta, gdy publikuje nowe treści, prowadzi kampanie w mediach społecznościowych itp. W przypadku jednej określonej agencji mogą mieć od 1 do 500 klientów. Każdy klient ma

witryny o wielkości od 5 stron do znacznie ponad 1 miliona. W ciągu ostatnich 5 lat każda agencja opisywała całą swoją pracę dla każdego klienta, w tym rodzaj wykonanej pracy, liczbę stron internetowych w witrynie, na które miało to wpływ, liczbę spędzonych godzin itp. powyższe dane, które zgromadziłem w hurtowni danych (umieszczone w zestawie schematów gwiazda / płatek śniegu), muszę określić, jak prawdopodobne było, że jakakolwiek praca (jedno zdarzenie w czasie) miała wpływ na ruch trafiający na dowolne / wszystkie strony, na które ma wpływ określona praca. Stworzyłem modele dla 40 różnych typów treści, które można znaleźć na stronie internetowej, które opisują typowy wzorzec ruchu, jaki może wystąpić na stronie o tym typie zawartości od daty uruchomienia do chwili obecnej. Znormalizowana względem odpowiedniego modelu, muszę określić najwyższą i najniższą liczbę zwiększonych lub zmniejszonych odwiedzających daną stronę otrzymaną w wyniku wykonania określonej pracy.

Chociaż mam doświadczenie z podstawową analizą danych (regresja liniowa i wielokrotna, korelacja itp.), Nie wiem, jak podejść do rozwiązania tego problemu. Podczas gdy w przeszłości zazwyczaj analizowałem dane z wieloma pomiarami dla danej osi (na przykład temperatura vs pragnienie vs zwierzę i określałem wpływ na pragnienie, jakie ma podwyższona temperatura u zwierząt), czuję, że powyżej próbuję przeanalizować wpływ pojedynczego zdarzenia w pewnym momencie dla nieliniowego, ale przewidywalnego (lub przynajmniej możliwego do modelowania),

zestaw danych podłużnych. Jestem zdumiony :(. Każda pomoc, wskazówki, wskazówki, zalecenia lub wskazówki byłyby niezwykle pomocne i byłbym wdzięczny na zawsze!

W czasach moich analityków danych ten typ problemu był dość typowy. Zasadniczo każdy w marketingu wpadłby na szalony pomysł, że sprzedaż wyższej kadrze jako jedno zdarzenie, które zwiększy KPI o 2000%. Przełożeni akceptowali ich, a potem rozpoczynali „test”. Wyniki wróciły, a kierownictwo zrzuciło je do analityków danych, aby ustalić, co zadziałało i kto to zrobił. Krótka odpowiedź brzmi: naprawdę nie możesz wiedzieć, czy nie został on uruchomiony jako losowy test w stylu A / B w podobnych okresach. Ale zdaję sobie sprawę, jak ułomna jest ta odpowiedź, zwłaszcza jeśli fakt, że nie ma czystej odpowiedzi, nie ma znaczenia dla pilności przyszłych decyzji biznesowych. Oto kilka technik, których użyłbym, aby uratować analizę w tej sytuacji, pamiętaj, że jest to bardziej sztuka niż nauka.

* Uchwyty Uchwyt to coś, co istnieje w danych, którego możesz się trzymać. Z tego, co mi mówisz w swojej sytuacji, masz wiele informacji o tym, kim jest agencja marketingowa, kiedy próbowała taktyki i do której witryny ją zastosowała. To jest twój punkt wyjścia i

informacje takie jak ta będą kamieniem węgielnym Twojej analizy.

* Metodologia Metodologia prawdopodobnie będzie miała największy wpływ na to, którym agencjom przypisuje się wszelkie zyski, więc będziesz musiał upewnić się, że jest ona jasno zarysowana, a wszyscy interesariusze zgadzają się, że ma to sens. Jeśli nie możesz tego zrobić, ludziom trudno będzie zaufać twojej analizie. Przykładem tego są konwersje. Powiedzmy, że dział marketingu kupuje kilka potencjalnych klientów i trafiają na naszą stronę docelową, śledzimy je przez 3 dni, a jeśli w tym czasie dokonają zakupu, uznamy je za przekonwertowane. Dlaczego 3 dni, dlaczego nie 5 lub 1? To nie jest ważne, o ile wszyscy się zgadzają, teraz masz definicję, na której możesz zbudować.

* Porównania Idealnie byłoby, gdybyś miał fajny test A / B, aby udowodnić ostateczną zależność. Zakładam, że brakuje ci tych danych, ale możesz się czegoś nauczyć z prostego porównania podobnych danych. Kiedy firmy próbują określić skuteczność reklamy radiowej, często wyświetlają reklamy w miesiącach offsetowych na tym samym rynku lub przez kilka miesięcy na jednym rynku i porównują to z wynikami na innym, ale podobnym rynku. To nie uchodzi za naukę, ale nawet przy całym tym hałasie silne wyniki będą prawie zawsze zauważalne. Połączyłbym je w twoim przypadku, aby określić, jak długo trwa wydarzenie, aby zarejestrować efekt. Gdy masz już dane z tego okresu, porównaj je z modelowaną prognozą ruchu, wzrostem z tygodnia na tydzień, z miesiąca na miesiąc itp., Co pozwoli na sensowne porównanie agencji i różnych okresów.

* Pragmatyzm Dążeniem jest być w stanie zapewnić głębokie zrozumienie przyczyny i skutku, ale prawdopodobnie nie jest to realistyczne. Ze względu na to, jak chaotyczne czynniki zewnętrzne wpływają na twoją analizę, jesteś

nieustannie napotykamy na pytanie: czy to wydarzenie zwiększyło wolumen / sprzedaż / liczbę kliknięć, czy w ogóle zrobienie czegoś przyniosłoby ten sam efekt? Najlepszą radą, jaką mogę w tej sprawie, jest ustalenie bardzo realistycznych celów dla tego, czego szukasz

pomiar. Dobrym punktem wyjścia jest, w ramach posiadanej metodologii, które wydarzenie miało największy wpływ. Kiedy już je otworzysz, stamtąd.

Podsumowanie

Po rozważeniu wszystkich tych aspektów możesz przystąpić do tworzenia ogólnego rozwiązania, które można następnie zautomatyzować. Zaletą projektowania rozwiązania w ten sposób jest to, że logika biznesowa jest już wbudowana. Dzięki temu Twoje wyniki będą znacznie bardziej przystępne i intuicyjne dla nietechnicznych liderów biznesu.

Edycja: Ostrzeżenie, zostawiam wiadomość, ale moja odpowiedź wydaje się błędna, sprawdź komentarz poniżej! Nie jestem ekspertem, ale wydaje mi się, że głównym problemem jest odpowiedź na pytanie: czy jakieś zdarzenie wpłynęło na liczbę trafień w określonym dniu? Ale nie wiem, jak traktować wiele zdarzeń, więc spróbuję odpowiedzieć na to pytanie: Czy zdarzenie X wpłynęło na liczbę trafień w określonym dniu? Na co można odpowiedzieć za pomocą testowania hipotez z wartościami p (co naukowcy robią, aby ocenić na przykład, czy lek wpływa na chorobę, czy nie). Używając wartości p, można określić, czy liczba trafień w danym dniu była po prostu przypadkowa i akceptowalna w normalnych okolicznościach, czy też musi odpowiadać zmianie w modelu. Więcej o wartościach p przeczytasz w Otwartym wprowadzeniu do Statistics Book. Stamtąd dowiedziałem się o nich więcej. Następnie pozostałe części problemu dotyczą tego, jak zidentyfikować swoje zdarzenia i obliczyć niezbędne parametry, aby odpowiedzieć na twoje pytanie (średnia / mediana, wariancja itp.), A także jak zachować to aktualne i działające.

Jak dobrać algorytmy do metod zespołowych?

Istnieje ogólne zalecenie, że algorytmy w kombinacjach uczenia się w zespołach powinny mieć inny charakter. Czy istnieje tabela klasyfikacyjna, skala lub jakieś reguły, które pozwalają ocenić, jak daleko są od siebie algorytmy? Jakie są najlepsze kombinacje?

Ogólnie w zespole starasz się łączyć opinie wielu klasyfikatorów. Pomysł jest jak poproszenie grupy ekspertów o to samo. Otrzymujesz wiele opinii i później musisz połączyć ich odpowiedzi (np. Za pomocą schematu głosowania). Aby ta sztuczka zadziałała, klasyfikatory różnią się od siebie, czyli nie chcesz dwukrotnie pytać tego samego „eksperta” o tę samą rzecz. W praktyce klasyfikatory nie muszą być różne w sensie innego algorytmu. Możesz wytrenować ten sam algorytm z innym podzbiorem danych lub innym podzbiorem funkcji (lub obydwoma). Jeśli używasz różnych zestawów treningowych, otrzymujesz różne modele i różne „niezależne” klasyfikatory. Nie ma złotej zasady określającej, co ogólnie działa najlepiej. Musisz spróbować sprawdzić, czy istnieje poprawa dla twojego konkretnego problemu.

Z reguły proponuję trzy różne opcje:

* Użyj techniki uczenia się w workach, podobnej do tej, po której stosuje się Random Forest. Technika ta umożliwia uczenie „małych” klasyfikatorów, które widzą niewielką część całych danych. Następnie prosty schemat głosowania (jak w Random Forest) doprowadzi Cię do bardzo interesującej i solidnej klasyfikacji.

* Użyj dowolnej techniki związanej z łączeniem informacji lub fuzją probabilistyczną. Jest to bardzo odpowiednie rozwiązanie, aby połączyć różne prawdopodobieństwa z różnych klasyfikatorów.

* Moja ostatnia sugestia to użycie logiki rozmytej, bardzo odpowiedniego narzędzia do prawidłowego łączenia informacji z perspektywy probabilistycznej (przynależności). Wybór konkretnych metod lub strategii będzie w ogromnym stopniu zależał od danych.

Binarny model klasyfikacji rzadkich / stronniczych danych

Mam zbiór danych z następującymi specyfikacjami:

* Zbiór danych treningowych z 193176 próbkami z 2821 pozytywami

* Zestaw danych testowych z 82887 próbkami z 673 pozytywami

* Istnieje 10 funkcji.

Chcę przeprowadzić klasyfikację binarną (powiedzmy 0/1). Problem, z którym się zmagam, polega na tym, że dane są bardzo stronnicze lub raczej skąpe. Po normalizacji i skalowaniu danych wraz z inżynierią funkcji i przy użyciu kilku różnych algorytmów, są to najlepsze wyniki, jakie mogłem osiągnąć:

średni błąd kwadratowy: 0,00804710026904

Macierz zamieszania: [[82214 667]

[0 6]]

czyli tylko 6 poprawnych trafień pozytywnych. To używa regresji logistycznej. Oto różne rzeczy. Próbowałem z tym:

* Różne algorytmy, takie jak RandomForest, DecisionTree, SVM

* Zmiana wartości parametrów w celu wywołania funkcji

* Pewna inżynieria funkcji oparta na intuicji, obejmująca funkcje złożone

Teraz moje pytania to:

  1. Co mogę zrobić, aby zwiększyć liczbę pozytywnych trafień?
  2. Jak można ustalić, czy w takim przypadku występuje overfit? (Próbowałem kreślić itp.)
  3. W którym momencie można by wywnioskować, czy jest to najlepsze możliwe dopasowanie, jakie mogłem mieć? (co wydaje się smutne, biorąc pod uwagę tylko 6 trafień na 673)
  4. Czy istnieje sposób, aby sprawić, by pozytywne instancje próbki ważyły ​​więcej, aby rozpoznawanie wzorców poprawiło się, prowadząc do większej liczby trafień?
  5. Które wykresy graficzne mogą pomóc wykryć wartości odstające lub jakąś intuicję co do tego, który wzór będzie najlepiej pasował?

Używam biblioteki scikit-learn w Pythonie i wszystkie implementacje są funkcjami bibliotecznymi.

Oto wyniki z kilkoma innymi algorytmami:

Losowy klasyfikator lasu (n_estimators = 100)

[[82211 667]

[3 6]]

Drzewa decyzyjne:

[[78611 635]

[3603 38]]

  1. Czy od czasu przeprowadzania klasyfikacji binarnej próbowałeś dostosować próg klasyfikacji? Ponieważ twój algorytm wydaje się raczej niewrażliwy, spróbuję go obniżyć i sprawdzić, czy jest poprawa.
  2. Zawsze możesz użyć krzywych uczenia się lub wykresu jednego parametru modelu względem błędu uczenia i walidacji, aby określić, czy model jest nadmiernie dopasowany. Wygląda na to, że w twoim przypadku jest to niedopasowane, ale to tylko intuicja.
  3. Cóż, ostatecznie zależy to od zbioru danych i różnych modeli, które wypróbowałeś. W tym momencie i bez dalszych testów nie może być jednoznacznej odpowiedzi.
  4. Nie twierdząc, że jesteś ekspertem w temacie, istnieje wiele różnych technik, które możesz zastosować (wskazówka: pierwszy link w google), ale moim zdaniem powinieneś najpierw upewnić się, że wybrałeś swoją funkcję kosztów, aby reprezentuje to, czego faktycznie szukasz.
  5. Nie jesteś pewien, co masz na myśli mówiąc o intuicji wzorowej, czy możesz to rozwinąć? A propos, jakie były twoje wyniki przy użyciu różnych algorytmów, które wypróbowałeś? Czy były inne?

Obsługa regularnie rosnącego zestawu funkcji

Pracuję nad systemem wykrywania oszustw. Na tym polu regularnie pojawiają się nowe oszustwa, więc na bieżąco trzeba dodawać nowe funkcje do modelu. Zastanawiam się, jak najlepiej sobie z tym poradzić (z perspektywy procesu deweloperskiego)? Samo dodanie nowej funkcji do wektora cech i ponowne szkolenie klasyfikatora wydaje się być naiwnym podejściem, ponieważ zbyt dużo czasu zostanie poświęcone na ponowne nauczenie się starych funkcji. Zastanawiam się nad wytrenowaniem klasyfikatora dla każdej cechy (lub kilku powiązanych cech), a następnie połączeniem wyników tych klasyfikatorów z ogólnym klasyfikatorem. Czy są jakieś wady tego podejścia? Jak mogę wybrać algorytm dla ogólnego klasyfikatora?

W idealnym świecie zachowujesz wszystkie swoje dane historyczne i rzeczywiście uruchamiasz nowy model z nową funkcją wyodrębnioną wstecz z danych historycznych. Twierdziłbym, że zasoby obliczeniowe wydane na to są w rzeczywistości całkiem przydatne. Czy to naprawdę problem? Tak, jest to powszechnie akceptowana technika tworzenia zespołu klasyfikatorów i łączenia ich

wyniki. Możesz zbudować nowy model równolegle tylko na nowych funkcjach i przeciętnie w jego prognozach. Powinno to zwiększyć wartość, ale nigdy nie uchwycisz interakcji między nowymi i starymi funkcjami w ten sposób, ponieważ nigdy nie pojawią się one razem w klasyfikatorze.

Oto pomysł, który właśnie wyskoczył niespodziewanie – co zrobić, jeśli użyjesz losowego próbkowania podprzestrzeni (jak w rzeczywistości zasugerował już Sean Owen), aby wyszkolić kilka nowych klasyfikatorów za każdym razem, gdy pojawi się nowa funkcja (używając losowego podzbioru funkcji, w tym nowy zestaw funkcji). Możesz trenować te modele również na podzbiorze próbek, aby zaoszczędzić trochę czasu na szkolenie. W ten sposób możesz mieć nowe klasyfikatory, które mogą przyjmować zarówno nowe, jak i stare funkcje, i zachowując jednocześnie stare klasyfikatory. Możesz nawet, używając techniki walidacji krzyżowej, mierzyć wydajność każdego klasyfikatora, po pewnym czasie zabić te najgorsze, aby uniknąć rozdętego modelu.

Jakie są standardowe sposoby obliczania odległości między plikami dokumentów?

Kiedy mówię „dokument”, mam na myśli strony internetowe, takie jak artykuły z Wikipedii i wiadomości. Wolę odpowiedzi, które zawierają albo waniliowe, leksykalne metryki odległości, albo najnowocześniejsze semantyczne metryki odległości, z silniejszą preferencją dla tych ostatnich. Jest na to wiele różnych sposobów, w zależności od tego, ile dokładnie informacji semantycznych chcesz zachować i jak łatwo tokenizować dokumenty (dokumenty html byłyby prawdopodobnie dość trudne do tokenizacji, ale można sobie wyobrazić coś z tagami i kontekstem .) Niektóre z nich zostały wspomniane przez ffriend, a wektory akapitowe użytkownika1133029 są naprawdę solidne, ale pomyślałem, że zagłębię się w plusy i minusy różnych podejść.

Odległość cosinusowa – wypróbowana, prawdziwa odległość cosinusowa jest prawdopodobnie najpowszechniejszą miarą odległości używaną ogólnie w wielu dziedzinach. Mając to na uwadze, jest bardzo mało informacji dotyczących odległości cosinusowych, które w rzeczywistości można odwzorować z powrotem na cokolwiek semantyczne, co wydaje się nie być idealne w tej sytuacji.

Odległość Levenshteina – znana również jako odległość edycji, jest zwykle używana na poziomie pojedynczego tokena (słowa, bigramy itp.). Generalnie nie polecałbym tej metryki, ponieważ nie tylko odrzuca ona wszelkie informacje semantyczne, ale także bardzo podobnie traktuje bardzo różne zmiany słów, ale jest to niezwykle powszechna metryka za tego typu rzeczy

LSA – jest częścią dużego arsenału technik służących do oceny podobieństwa dokumentów zwanego modelowaniem tematycznym. LSA wyszedł z mody całkiem niedawno iz mojego doświadczenia wynika, że ​​nie jest to najmocniejsze podejście do modelowania tematycznego, ale jest stosunkowo proste do wdrożenia i ma kilka wdrożeń open source

LDA – jest również techniką używaną do modelowania tematycznego, ale różni się od LSA tym, że w rzeczywistości uczy się wewnętrznych reprezentacji, które wydają się być bardziej płynne i intuicyjne. Ogólnie rzecz biorąc, wyniki uzyskane z LDA są lepsze do modelowania podobieństwa dokumentów niż LSA, ale nie są tak dobre, aby nauczyć się silnego rozróżniania tematów.

Alokacja Pachinko – to naprawdę zgrabne rozszerzenie oprócz LDA. Ogólnie jest to po prostu znacznie ulepszona wersja LDA, z jedynym minusem jest to, że trenowanie zajmuje nieco więcej czasu, a implementacje open-source są nieco trudniejsze do zdobycia

word2vec – Google pracuje nad serią technik inteligentnego redukowania słów i dokumentów do bardziej rozsądnych wektorów niż rzadkie wektory uzyskiwane za pomocą technik takich jak Count Vectorizers i TF-IDF. Word2vec jest świetny, ponieważ ma wiele implementacji open source. Gdy już mamy wektor, można zastosować dowolną inną metrykę podobieństwa (np. Odległość cosinus) ze znacznie większą skutecznością.

* doc2vec – znany również jako wektory akapitowe, jest to najnowszy i największy z serii artykułów Google, poświęcony gęstym reprezentacjom wektorowym dokumentów. Biblioteka gensim w Pythonie ma implementację word2vec, która jest na tyle prosta, że można ją dość rozsądnie wykorzystać do zbudowania doc2vec, ale pamiętaj o licencji, jeśli chcesz iść tą drogą Mam nadzieję, że to pomoże, daj mi znać, jeśli masz jakieś pytania.

Istnieje wiele semantycznych miar odległości, z których każda ma swoje wady i zalety. Oto tylko kilka z nich:

* odległość cosinusowa, iloczyn skalarny między wektorami cech dokumentu; * LSA, inny model oparty na wektorze, ale wykorzystujący SVD do usuwania szumów z oryginalnej macierzy dokumentów terminowych;

* Oparty na WordNet, zweryfikowany przez człowieka, choć trudno go rozszerzyć.

Zacznij od najprostszego podejścia, a następnie przejdź dalej w oparciu o problemy w Twoim konkretnym przypadku.

Wydaje się, że najnowszym stanem techniki są „wektory akapitowe” wprowadzone w niedawnym artykule:

http://cs.stanford.edu/~quocle/paragraph_vector.pdf. Odległość kosinusowa / euklidesowa między wektorami akapitu prawdopodobnie działałaby lepiej niż jakiekolwiek inne podejście. Prawdopodobnie nie jest to jeszcze możliwe z powodu braku implementacji open source. Kolejną najlepszą rzeczą jest odległość cosinusowa między wektorami LSA lub odległość cosinusowa między surowymi wektorami BOW. Czasami lepiej jest wybrać różne schematy ważenia, takie jak TFIDF.

[44][Machine Learning]

Z książki The Discipline of Machine Learning autorstwa Toma Mitchella:

Dziedzina uczenia maszynowego stara się odpowiedzieć na pytanie „Jak możemy budować systemy komputerowe, które automatycznie ulepszają się wraz z doświadczeniem i jakie są podstawowe prawa rządzące wszystkimi procesami uczenia się?” To pytanie obejmuje szeroki zakres zadań edukacyjnych, takich jak projektowanie autonomicznych robotów mobilnych, które uczą się nawigować na podstawie własnego doświadczenia, jak przeszukiwać historyczną dokumentację medyczną, aby dowiedzieć się, którzy przyszli pacjenci będą najlepiej reagować na które terapie i jak budować wyszukiwarki, które automatycznie dostosowują się do zainteresowań ich użytkowników. Mówiąc dokładniej, mówimy, że maszyna uczy się w odniesieniu do konkretnego zadania T, miernika wydajności P i rodzaju doświadczenia E, jeśli system niezawodnie poprawia wydajność P w zadaniu T, po doświadczeniu E. W zależności od tego, jak określimy T, P i E, zadanie uczenia się może być również nazywane nazwami, takimi jak eksploracja danych, autonomiczne wykrywanie, aktualizacja bazy danych, programowanie według przykładów itp.

PYTANIA:

Użyj liblinear w przypadku dużych zbiorów danych do analizy semantycznej

Używam Libsvm do trenowania danych i przewidywania klasyfikacji na problem analizy semantycznej. Ale ma to problem z wydajnością w przypadku danych o dużej skali, ponieważ analiza semantyczna dotyczy problemu z wymiarami. W zeszłym roku Liblinear został wydany i może rozwiązać wąskie gardło wydajności. Ale kosztowało to zbyt dużo pamięci. Czy MapReduce to jedyny sposób rozwiązania problemu analizy semantycznej w przypadku dużych zbiorów danych? A może są jakieś inne metody, które mogą poprawić wąskie gardło pamięci w Liblinear?

ODPOWIEDZI:

Zauważ, że istnieje wczesna wersja LIBLINEAR przeportowana do Apache Spark. Zobacz komentarze na liście mailingowej, aby uzyskać wczesne szczegóły i witrynę projektu.

Możesz sprawdzić wabbit samogłosek. Jest dość popularny w przypadku uczenia się na dużą skalę i zawiera równoległe przepisy. Z ich strony internetowej:

VW to kwintesencja szybkości w uczeniu maszynowym, umożliwiająca łatwe uczenie się na podstawie zestawów danych terafeature. Poprzez uczenie równoległe może przekroczyć przepustowość dowolnego interfejsu sieciowego maszyny podczas uczenia liniowego, pierwszego spośród algorytmów uczenia się.

Dlaczego nadmierne dopasowanie jest złe w uczeniu maszynowym?

Logika często stwierdza, że ​​nadmierne dopasowanie modelu ogranicza jego zdolność do uogólniania, chociaż może to oznaczać tylko, że nadmierne dopasowanie powstrzymuje model przed ulepszaniem po określonej złożoności. Czy nadmierne dopasowanie powoduje pogorszenie się modeli niezależnie od złożoności danych, a jeśli tak, to dlaczego tak się dzieje? Powiązane: Kontynuacja powyższego pytania: „Kiedy model jest niedopasowany? ”

Przebudowanie jest empirycznie złe. Załóżmy, że masz zbiór danych, który podzielisz na dwie części, test i uczenie. Model nadmiernie dopasowany to taki, który działa znacznie gorzej na zestawie danych testowych niż na zestawie danych uczących. Często obserwuje się, że takie modele również generalnie wypadają gorzej na dodatkowych (nowych) testowych zestawach danych niż modele, które nie są nadmiernie wyposażone.

Jednym ze sposobów zrozumienia tego intuicyjnie jest to, że model może wykorzystywać pewne istotne części danych (sygnał) i niektóre nieistotne części (szum). Model z nadmiernym wyposażeniem wykorzystuje więcej hałasu, co zwiększa jego wydajność w przypadku znanego hałasu (dane treningowe) i zmniejsza jego wydajność w przypadku nowego hałasu (dane testowe). Różnica w wydajności między danymi treningowymi i testowymi wskazuje, ile szumów wychwytuje model; a wychwycenie szumu bezpośrednio przekłada się na gorszą wydajność danych testowych (w tym przyszłych danych). Podsumowanie: nadmierne dopasowanie jest złe z definicji, nie ma to wiele wspólnego ze złożonością lub zdolnością do generalizacji, ale raczej z pomyleniem szumu z sygnałem.

P.S. Jeśli chodzi o „zdolność do uogólniania” pytania, bardzo możliwe jest posiadanie modelu, który ma z natury ograniczoną zdolność do uogólniania ze względu na strukturę modelu (np. Liniowa SVM,…), ale nadal jest podatny na nadmierne dopasowanie. W pewnym sensie nadmierne dopasowanie jest tylko jednym ze sposobów, w jakie uogólnianie może się nie powieść.

Overfitting, w skrócie, oznacza branie pod uwagę zbyt dużej ilości informacji z twoich danych i / lub wcześniejszej wiedzy i wykorzystanie ich w modelu. Aby uprościć sprawę, rozważ następujący przykład: niektórzy naukowcy zatrudniali cię, aby dostarczyć im model do przewidywania wzrostu jakiegoś rodzaju roślin. Naukowcy przez cały rok przekazywali Wam informacje zebrane podczas pracy z takimi roślinami i na bieżąco będą informować o przyszłym rozwoju ich plantacji. Więc przeglądasz otrzymane dane i budujesz na ich podstawie model. Załóżmy teraz, że w swoim modelu uwzględniłeś możliwie jak najwięcej cech, aby zawsze określić dokładne zachowanie roślin, które widziałeś w początkowym zbiorze danych. Teraz jako produkcja

kontynuuje, zawsze będziesz brać pod uwagę te cechy i uzyskasz bardzo szczegółowe wyniki. Jeśli jednak plantacja w końcu ulegnie zmianie sezonowej, wyniki, które otrzymasz, mogą pasować do twojego modelu w taki sposób, że twoje prognozy zaczną zawodzić (albo mówiąc, że wzrost spowolni, podczas gdy faktycznie przyspieszy, lub przeciwieństwo). Oprócz tego, że nie można wykryć tak małych odchyleń i zwykle nieprawidłowo klasyfikować wpisy, drobnoziarnisty model, tj. Duża liczba zmiennych, może spowodować, że przetwarzanie będzie zbyt kosztowne. Teraz wyobraź sobie, że Twoje dane są już złożone. Nadmierne dopasowanie modelu do danych nie tylko sprawi, że klasyfikacja / ocena będzie bardzo złożona, ale najprawdopodobniej sprawi, że błędnie przewidujesz najmniejszą zmienność danych wejściowych, jaką możesz mieć. Edycja: Równie dobrze może to być przydatne, być może dodając dynamiki do powyższego wyjaśnienia

To dlatego, że coś nazywa się dylematem odchylenia i wariancji. Przekrojony model oznacza, że będziemy mieć bardziej złożoną granicę decyzyjną, jeśli damy więcej wariancji w modelu. Chodzi o to, że nie tylko zbyt proste modele, ale także złożone modele mogą ujawnić sklasyfikowane wyniki na niewidocznych danych. W konsekwencji model z nadmiernym dopasowaniem nie jest tak dobry jak model niedopasowany. Dlatego nadmierne dopasowanie jest złe i musimy dopasować model gdzieś pośrodku.

Czy istnieją interfejsy API do przeszukiwania streszczeń papieru?

Jeśli mam bardzo długą listę nazw artykułów, w jaki sposób mogę uzyskać streszczenie tych artykułów z Internetu lub dowolnej bazy danych? Nazwy artykułów są jak „Ocena użyteczności w eksploracji sieciowej w dziedzinie zdrowia publicznego”.

Czy ktoś zna jakieś API, które może dać mi rozwiązanie? Próbowałem zaindeksować Google Scholar, jednak Google zablokowało mojego robota.

Sprawdź to na:

*Google Scholar

* Citeseer

Jeśli trafisz dokładnie w jeden tytuł, prawdopodobnie znalazłeś właściwy artykuł i możesz podać tam resztę informacji. Oba zapewniają linki do pobierania i wyjście w stylu bibtex. To, co prawdopodobnie chciałbyś zrobić, aby uzyskać doskonałe metadane, to pobrać i przeanalizować plik PDF (jeśli istnieje) i poszukać identyfikatora w stylu DOI. Jeśli to zrobisz, bądź miły i ogranicz stawki.

arXiv ma interfejs API i pobieranie zbiorcze, ale jeśli chcesz coś dla płatnych czasopism, trudno będzie go zdobyć bez płacenia indeksatorowi, takim jak pubmed, elsevier lub tym podobnym.

Techniki uczenia maszynowego do szacowania wieku użytkowników na podstawie ulubionych witryn na Facebooku

Mam bazę danych z mojej aplikacji na Facebooku i próbuję wykorzystać uczenie maszynowe do oszacowania wieku użytkowników na podstawie tego, jakie strony na Facebooku lubią. Moja baza danych ma trzy kluczowe cechy:

rozkład wieku w moim zestawie treningowym (łącznie 12 tys. użytkowników) jest wypaczony w kierunku młodszych użytkowników (tj. mam 1157 użytkowników w wieku 27 lat i 23 użytkowników w wieku 65 lat); wiele witryn ma nie więcej niż 5 polubień (odfiltrowałem strony FB z mniej niż 5 polubieniami). jest o wiele więcej funkcji niż próbek. Tak więc moje pytania są następujące: jaką strategię byś zaproponował, aby przygotować dane do dalszej analizy? Czy powinienem dokonać jakiejś redukcji wymiarowości? Która metoda ML byłaby najbardziej odpowiednia do zastosowania w tym przypadku? Używam głównie Pythona, więc wskazówki specyficzne dla Pythona byłyby bardzo mile widziane.

Jedną rzeczą, od której warto zacząć, byłoby k-NN. Chodzi o to, że masz macierz użytkowników / pozycji, a dla niektórych użytkowników masz zgłoszony wiek. Wiek osoby w macierzy elementów użytkownika może być dobrze określony przez coś w rodzaju średniego lub mediany wieku niektórych osób

najbliżsi sąsiedzi w obszarze przedmiotów. Więc masz każdego użytkownika wyrażonego jako wektor w przestrzeni przedmiotów, znajdź k najbliższych sąsiadów i przypisz do danego wektora jakąś sumaryczną statystykę najbliższych sąsiadów. Możesz wybrać k na odcięciu odległości lub, bardziej realistycznie, przez iteracyjne przypisywanie wieku pociągowi i wybranie k, które minimalizuje błąd w tym przypisaniu. Jeśli wymiarowość jest problemem, możesz łatwo przeprowadzić redukcję w tej konfiguracji przez dekompozycję pojedynczych wartości, wybierając m wektorów, które wychwytują największą wariancję w całej grupie. We wszystkich przypadkach, ponieważ każda cecha jest binarna, wydaje się, że podobieństwo cosinusowe będzie miarą odległości. Muszę trochę więcej pomyśleć o innych podejściach (regresja, rf itp.), Biorąc pod uwagę wąski zakres twojej przestrzeni funkcji (wszystkie warianty tego samego działania, upodobanie). Myślę, że podejście użytkownik / przedmiot może być najlepsze. Jedna uwaga, jeśli wiek, który masz na szkolenie, jest zgłaszany przez samego siebie, być może będziesz musiał poprawić niektóre z nich. Osoby na Facebooku zwykle podają wiek w dekadzie urodzenia. Sporządź histogram dat urodzenia (na podstawie wieku) i zobacz, czy masz skoki w dekadach, takich jak lata 70., 80., 90.

Niedawno zrobiłem podobny projekt w Pythonie (przewidywanie opinii przy użyciu danych podobnych do FB) i miałem dobre wyniki w następującym podstawowym procesie:

  1. Wczytaj zestaw uczący (n = N), wykonując iterację po oddzielonych przecinkami, takich jak rekordy wiersz po wierszu, i użyj licznika, aby zidentyfikować najpopularniejsze strony
  2. Dla każdej z K najpopularniejszych stron (użyłem około 5000, ale możesz bawić się różnymi wartościami), użyj pandy.DataFrame.isin, aby sprawdzić, czy każda osoba w zestawie treningowym lubi każdą stronę, a następnie zrób N x K dataframe wyników (nazwę ją xdata_train)
  3. Utwórz serię (nazwę ją ydata_train) zawierającą wszystkie zmienne wynikowe (w moim przypadku opinie w Twoim wieku) z tym samym indeksem co xdata_train
  4. Skonfiguruj losowy klasyfikator lasu za pomocą scikit-learn, aby przewidzieć ydata_train na podstawie xdata_train
  5. Użyj testów krzyżowej walidacji scikit-learn, aby dostosować parametry i poprawić dokładność (poprawianie liczby popularnych stron, liczby drzew, minimalnego rozmiaru liści itp.)
  6. Wyprowadź losowy klasyfikator lasu i listę najpopularniejszych stron z marynatą (lub zachowaj w pamięci, jeśli robisz wszystko na raz)
  7. Wczytaj pozostałe dane, załaduj listę popularnych stron (jeśli to konieczne) i powtórz krok 2, aby utworzyć xdata_new
  8. Załaduj losowy klasyfikator lasu (jeśli to konieczne) i użyj go do przewidywania wartości danych xdata_new
  9. Prześlij przewidywane wyniki do nowego pliku CSV lub innego wybranego formatu wyjściowego

Powinieneś także pamiętać o najbardziej niesamowitej funkcji lasów losowych w Pythonie: natychmiastowa równoległość! Ci z nas, którzy zaczęli to robić w R, a potem przenieśli się tam, są zawsze zdumieni, zwłaszcza gdy zaczynasz pracować na maszynie z kilkudziesięcioma rdzeniami. Na koniec zwróć uwagę, że byłaby to doskonała aplikacja do analizy sieci, jeśli masz dane o znajomych, a także o samych osobach. Jeśli potrafisz przeanalizować wiek znajomych użytkownika, wiek użytkownika prawie na pewno będzie mniejszy o rok lub dwa od mediany wśród jego znajomych, zwłaszcza jeśli użytkownicy są wystarczająco młodzi, aby zbudować

ich sieci znajomych jeszcze w szkole (ponieważ większość z nich to koledzy z klasy). Ta prognoza prawdopodobnie przewyższyłaby wszystko, co można uzyskać z modelowania – jest to podręcznikowy przykład problemu, w którym za każdym razem właściwe dane> właściwy model.

Inną sugestią jest przetestowanie regresji logistycznej. Dodatkową korzyścią jest to, że wagi (współczynniki) modelu dają wyobrażenie o tym, które witryny mają wpływ na wiek. Sklearn oferuje pakiet sklearn.linear_model.LogisticRegression, który jest przeznaczony do

obsługują również rzadkie dane. Jak wspomniano w komentarzach, w omawianym przypadku, przy większej liczbie zmiennych wejściowych niż próbek, należy uregulować model (za pomocą sklearn.linear_model.LogisticRegression użyj argumentu kara = „l1”).

 Czy nauka o danych to tylko trend, czy też koncepcja długoterminowa?

Widzę wiele kursów z zakresu Data Science pojawiających się w ciągu ostatnich 2 lat. Nawet duże uniwersytety, takie jak Stanford i Columbia, oferują stwardnienie rozsiane w szczególności w naukach o danych. Ale jak długo widzę, wygląda na to, że nauka o danych jest po prostu połączeniem technik informatycznych i statystycznych. Dlatego zawsze o tym myślę. Jeśli to tylko trend i za 10 lat ktoś nadal będzie wymieniał naukę o danych jako całą dziedzinę lub tylko temat / temat w CS lub statystykach. Co myślisz?

Jedno można powiedzieć na pewno: nikt nie może tego powiedzieć na pewno. I rzeczywiście może do pewnego stopnia opierać się na opiniach. Wprowadzenie terminów takich jak „duże zbiory danych”, które niektórzy uważają za „hipnotyzujące” lub „modne słowa”, nie ułatwia sformułowania właściwej odpowiedzi. Ale spróbuję. Ogólnie rzecz biorąc, wydaje się, że dziedziny interdyscyplinarne często mają problem z brakiem traktowania ich poważnie w żadnej z dziedzin, którymi się zajmują. Jednak im więcej badań inwestuje się w daną dziedzinę, tym większa jest potrzeba podzielenia tej dziedziny na kilka podtematów. I te podtematy, które były później znane, muszą zostać ponownie połączone w nowy sposób, aby zapobiec nadmiernej specjalizacji oraz aby zwiększyć i poszerzyć zastosowanie technik opracowanych przez (ponad?) Wyspecjalizowanych ekspertów w różnych dziedzinach. Uważam „naukę o danych” za takie podejście, które łączy wiedzę specjalistyczną i odkrycia z różnych dziedzin. Opisałeś to jako… połączenie technik informatycznych i statystycznych I rzeczywiście, kilka pytań ma na celu rozróżnienie między nauką o danych a statystyką. Jednak czysty statystyka najprawdopodobniej nie będzie w stanie skonfigurować klastra Hadoop i pokazać wyników swojej analizy na interaktywnym pulpicie nawigacyjnym HTML5. A ktoś, kto potrafi zaimplementować ładny pulpit nawigacyjny HTML5, może nie być tak zaznajomiony z matematycznym tłem testu Chi-kwadrat. Rozsądne jest założenie, że przekazanie studentom wystarczającej wiedzy do zastosowania najważniejszych technik z różnych dziedzin, które są objęte nauką o danych, doprowadzi do nowych zastosowań tych technik i przyniesie korzyści – także „purystom” w tych dziedzinach. Połączenie tych technik w wielu przypadkach nie jest proste i może uzasadniać własną gałąź badań. Zapytałeś również, czy za 10 lat nauka o danych będzie traktowana jako „tylko temat w informatyce”. Ponownie: nikt nie może tego powiedzieć na pewno. Ale zastanawiam się, w którym momencie ludzie przestali zadawać sobie pytanie, czy „Informatyka” będzie kiedyś traktowana tylko jako mieszanka (lub przedmiot) elektrotechniki i matematyki…

Jak określić ważne atrybuty?

Załóżmy, że zbiór danych o luźnej strukturze (np. Tabele internetowe / połączone otwarte dane), składający się z wielu źródeł danych. Nie ma wspólnego schematu, po którym następują dane, a każde źródło może używać atrybutów synonimów do opisu wartości (np. „Narodowość” czy „urodzony w”). Moim celem jest znalezienie „ważnych” atrybutów, które w jakiś sposób „definiują” byty, które opisują. Kiedy więc znajdę tę samą wartość dla takiego atrybutu, będę wiedział, że te dwa opisy najprawdopodobniej dotyczą tego samego podmiotu (np. Tej samej osoby). Na przykład atrybut „lastName” jest bardziej dyskryminujący niż atrybut „nationality”. Jak mogę (statystycznie) znaleźć takie atrybuty, które są ważniejsze od innych? Naiwnym rozwiązaniem byłoby przyjęcie średniej wartości IDF wartości każdego atrybutu i uczynienie z tego współczynnika „ważności” atrybutu. Podobnym podejściem byłoby policzenie, ile różnych wartości pojawia się dla każdego atrybutu. Widziałem termin cecha lub wybór atrybutów w uczeniu maszynowym, ale nie chcę odrzucać pozostałych atrybutów, chcę po prostu nadać większą wagę najważniejszym.

Właściwie jest więcej niż jedno pytanie, na które należy odpowiedzieć:

  1. Jak pracować na danych bez schematów / luźnych / brakujących danych
  2. Jak oznaczyć osobę (z tego, co rozumiem bez nadzoru) i stworzyć identyfikator
  3. Jak wyszkolić swój system, aby mógł powiedzieć, jakich atrybutów należy użyć, aby zidentyfikować osobę

Jak wspomniał Rubens, możesz użyć metod drzew decyzyjnych, w szczególności Random Forests, do obliczania najważniejszych atrybutów na podstawie uzyskanych informacji, jeśli już znalazłeś sposób na określenie, jak nazwać osobę. Jeśli jednak nie masz żadnych informacji o etykiecie, możesz użyć widoku eksperta do wstępnego wyboru atrybutów. Następnie dokonujesz nienadzorowanej klasyfikacji, aby odzyskać swoje etykiety. Na koniec możesz wybrać najważniejsze pola za pomocą Random Forest lub innych metod, takich jak Bayesian Belief Networks.

Aby to wszystko osiągnąć, potrzebujesz również pełnego zestawu danych. Jeśli twój zestaw danych jest luźny, musisz ręcznie lub heurystycznie znaleźć sposób na połączenie atrybutów wskazujących to samo z różnymi nazwami. Co więcej, możesz użyć technik imputacji, takich jak metoda maksymalizacji oczekiwań i uzupełnić zestaw danych. Możesz też pracować z sieciami bayesowskimi i pozostawić brakujące pola bez zmian.

Algorytm generowania reguł klasyfikacji

Mamy więc potencjał dla aplikacji do uczenia maszynowego, która dość dobrze pasuje do tradycyjnej domeny problemu rozwiązanej przez klasyfikatory, tj. Mamy zestaw atrybutów opisujących element i „wiadro”, w którym kończą. Jednak zamiast tworzyć modele prawdopodobieństw, jak w Naiwnych Bayesach lub podobnych klasyfikatorach, chcemy, aby nasz wynik był zbiorem

reguły czytelne dla człowieka, które mogą być przeglądane i modyfikowane przez użytkownika końcowego. Uczenie się reguł asocjacyjnych wygląda jak rodzina algorytmów, które rozwiązują tego typu problemy, ale wydaje się, że algorytmy te koncentrują się na identyfikowaniu typowych kombinacji cech i nie uwzględniają koncepcji końcowego segmentu, na który te cechy mogą wskazywać. Na przykład nasz zestaw danych wygląda mniej więcej tak:

Pozycja A {4-drzwiowa, mała, stalowa} => {sedan}

Pozycja B {2-drzwiowe, duże, stalowe} => {ciężarówka}

Pozycja C {2-drzwiowe, małe, stalowe} => {coupe}

Chcę tylko reguł, które mówią „jeśli jest duży i 2-drzwiowy, to ciężarówka”, a nie reguł, które mówią „jeśli to jest 4-drzwiowe, to jest też małe”. Jednym ze sposobów obejścia tego problemu jest po prostu użycie algorytmów uczenia się reguł asocjacyjnych i

zignoruj ​​zasady, które nie obejmują segmentu końcowego, ale wydaje się to trochę hakerskie. Czy przegapiłem jakąś rodzinę algorytmów? A może na początku podchodzę do problemu nieprawidłowo?

C45 firmy Quinlan jest w stanie stworzyć regułę przewidywania. Sprawdź tę stronę Wikipedii. Wiem, że w Weka nazywa się J48. Nie mam pojęcia, które są implementacjami w R lub Pythonie. W każdym razie z tego rodzaju drzewa decyzyjnego powinieneś być w stanie wywnioskować reguły przewidywania. Możesz również być zainteresowany algorytmami do bezpośredniego wnioskowania reguł klasyfikacji. RIPPER to taki, który ponownie w Weka otrzymał inną nazwę JRip.

W rzeczywistości jest to jeszcze prostsze, z tego, co opisujesz – po prostu szukasz podstawowego algorytmu drzewa klasyfikacyjnego (więc nie ma potrzeby stosowania nieco bardziej złożonych wariantów, takich jak C4.5, które są zoptymalizowane pod kątem dokładności przewidywania). Tekst kanoniczny to:

Jest to łatwo zaimplementowane w R:

http://cran.r-project.org/web/packages/tree/tree.pdf

i Python:

http://scikit-learn.org/stable/modules/tree.html

Możesz rzucić okiem na ucznia reguły CN2 w Orange 2

Rozpoznawanie aktywności człowieka za pomocą zestawu danych smartfonów Jestem nowy w tej społeczności i mam nadzieję, że moje pytanie będzie tu dobrze pasować. W ramach mojego licencjackiego kursu analityki danych zdecydowałem się wykonać projekt dotyczący rozpoznawania działalności człowieka za pomocą zestawów danych smartfonów. Jeśli chodzi o mnie, ten temat dotyczy uczenia maszynowego i maszyn wektorów wsparcia. Nie znam jeszcze dobrze tych technologii, więc będę potrzebować pomocy. Zdecydowałem się podążać za tym pomysłem na projekt http://www.inf.ed.ac.uk/teaching/courses/dme/2014/datasets.html (pierwszy projekt na górze) Celem projektu jest określenie, jaką aktywność wykonuje dana osoba angażowanie się (np. WALKING, WALKING_UPSTAIRS, WALKING_DOWNSTAIRS, SITTING, STANDING, LAYING) z danych zarejestrowanych przez smartfon (Samsung Galaxy S II) w talii badanego. Korzystając z wbudowanego akcelerometru i żyroskopu, dane obejmują 3-osiowe przyspieszenie liniowe i 3-osiową prędkość kątową przy stałej częstotliwości 50 Hz. Cały zestaw danych znajduje się w jednym folderze z opisem i etykietami funkcji. Dane są podzielone na pliki „testowe” i „pociągowe”, w których dane są reprezentowane w następującym formacie:

2.5717778e-001 -2.3285230e-002 -1.4653762e-002 -9.3840400e-001 -9.2009078e-001 -6.6768331e-001 -9.5250112e-

A to tylko bardzo mała próbka zawartości pliku. Naprawdę nie wiem, co reprezentują te dane i jak można je zinterpretować. Jakich narzędzi będę potrzebować również do analizy, klasyfikacji i grupowania danych? Czy jest jakiś sposób, w jaki mogę umieścić te dane w programie Excel z dołączonymi etykietami i na przykład użyć R lub Pythona do wyodrębnienia przykładowych danych i pracy nad tym? Wszelkie wskazówki / wskazówki byłyby bardzo mile widziane.

Definicje zestawu danych znajdują się na stronie tutaj:

Informacje o atrybutach na dole lub możesz zobaczyć w folderze ZIP plik o nazwie activity_labels, który zawiera nagłówki kolumn, upewnij się, że uważnie przeczytałeś README, zawiera on kilka dobrych informacji. Możesz łatwo wprowadzić plik .csv do R za pomocą polecenia read.csv. Na przykład, jeśli nazwiesz plik samsungdata, możesz otworzyć R i uruchomić to polecenie:

data <- read.csv (“katalog / gdzie / plik / jest / znajduje / samsungdata.csv”, nagłówek = PRAWDA)

Lub jeśli jesteś już w katalogu roboczym w R, możesz po prostu uruchomić następujące

dane <- read.csv (“samsungdata.csv”, nagłówek = TRUE)

Gdzie dane nazwy można zmienić na cokolwiek chcesz nazwać swoim zestawem danych.

Wygląda na to, że ten (lub bardzo podobny zestaw danych) jest używany do kursów Coursera. Czyszczenie tego zestawu danych jest zadaniem pobierania i czyszczenia danych, ale jest również używane w studium przypadku do analizy danych eksploracyjnych. Film z tego studium przypadku jest dostępny w postaci nagrań wideo z 4 tygodnia materiałów szkoleniowych EDA. Może ci pomóc zacząć od tych danych.

Czy algorytmy uczenia maszynowego mogą przewidywać wyniki sportowe lub gry?

Mam wiele zbiorów danych dotyczących NFL, które moim zdaniem mogą stanowić dobry projekt poboczny, ale jeszcze nic z nimi nie zrobiłem. Wejście na tę stronę sprawiło, że pomyślałem o algorytmach uczenia maszynowego i zastanawiałem się, jak dobre mogą one być w przewidywaniu wyniku meczów piłkarskich lub nawet następnego meczu. Wydaje mi się, że można by było zidentyfikować pewne trendy – przy trzeciej próbie i pierwszej, drużyna z silnym biegiem teoretycznie powinna mieć w tej sytuacji tendencję do prowadzenia piłki. Punktacja może być trudniejsza do przewidzenia, ale zwycięska drużyna może być. Moje pytanie brzmi, czy są to dobre pytania do rzucenia na algorytm uczenia maszynowego. Możliwe, że tysiące osób próbowało tego wcześniej, ale natura sportu sprawia, że ​​jest to niewiarygodny temat.

Jest wiele dobrych pytań na temat piłki nożnej (i ogólnie sportu), które fajnie byłoby rzucić na algorytm i zobaczyć, co z niego wyjdzie. Najtrudniejsze jest wiedzieć, co wrzucić do algorytmu. Drużyna z dobrym RB mogłaby po prostu spasować na trzecim i krótkim miejscu tylko dlatego, że na przykład przeciwnicy prawdopodobnie oczekiwaliby runu. Tak więc, aby faktycznie uzyskać jakieś wartościowe wyniki, rozbiję problem na mniejsze części i przeanalizuję je statystycznie, rzucając je do maszyn! Istnieje kilka (dobrych) witryn internetowych, które próbują zrobić to samo. Sprawdź je i skorzystaj z wszelkich znalezionych informacji, aby Ci pomóc:

* Football Outsiders

* Zaawansowana analiza piłki nożnej

A jeśli naprawdę chcesz poznać analizę danych sportowych, zdecydowanie powinieneś sprawdzić filmy z konferencji Sloan Sports Conference

Tak. Dlaczego nie?! Przy tak dużej ilości danych zapisywanych w każdym sporcie w każdej grze, inteligentne wykorzystanie danych może doprowadzić nas do uzyskania ważnych informacji na temat wyników graczy. Kilka przykładów:

Baseball: W filmie Moneyball (będącym adaptacją książki MoneyBall) Brad Pitt gra postać, która analizuje statystyki graczy, aby stworzyć drużynę, która radzi sobie niezwykle dobrze! Było to przedstawienie prawdziwej historii życia drużyny baseballowej Oakland Athletics. Aby uzyskać więcej informacji, http://www.theatlantic.com/entertainment/archive/2013/09/forget-2002-this-yearsoakland- as-are-the-real-em-moneyball-em-team / 279927 /

Krykiet: SAP Labs opracowało narzędzie do analizy aukcji, które dostarczyło wglądu w wpływ graczy, których warto kupić na aukcji Indian Premier League w 2014 roku dla zespołu Kolkata Knight Riders, który ostatecznie wygrał IPL Championship 2014. Aby uzyskać więcej informacji, http://scn.sap.com/community/hana-inmemory/blog/2014/06/10/sap-hana-academy-cricket-demo—how-sap-hana-poweredthe- kolkata-knight- mistrzostwa-zawodników-ipl.

Zatem tak, analiza statystyczna zapisów graczy może dać nam wgląd w to, którzy gracze są bardziej skłonni do wykonania, ale nie którzy zagrają. Tak więc uczenie maszynowe, bliski kuzyn analizy statystycznej, okaże się przełomem.

Zdecydowanie tak. Mogę skierować cię do ładnego papieru. Kiedyś użyłem go do implementacji algorytmu przewidywania wyników ligi piłkarskiej, przede wszystkim mając na celu uzyskanie pewnej wartości dla bukmacherów.

Ze streszczenia artykułu:

dynamiczny uogólniony model Bayesa do szacowania zależnych od czasu umiejętności wszystkich drużyn w lidze i przewidywania meczów piłkarskich w przyszły weekend.

Słowa kluczowe:

Modele dynamiczne, uogólnione modele liniowe, modele graficzne, metody Monte Carlo łańcucha Markowa, przewidywanie meczów piłkarskich

Jakie są łatwe do nauczenia aplikacje do uczenia maszynowego?

Będąc nowicjuszem w uczeniu maszynowym, chciałbym zacząć się bawić i zobaczyć, jakie są możliwości. Jestem ciekawy, jakie aplikacje możesz polecić, które zapewniłyby najszybszy czas

od instalacji do uzyskania znaczącego wyniku. Będą również mile widziane wszelkie zalecenia dotyczące dobrych materiałów początkowych na temat uczenia się maszynowego.

Poleciłbym zacząć od kursu MOOC na temat uczenia maszynowego. Na przykład kurs Andrew Ng na Coursera. Warto też przyjrzeć się aplikacji Orange. Ma interfejs graficzny i prawdopodobnie łatwiej jest zrozumieć niektóre techniki ML przy jego użyciu.

Szczerze mówiąc, myślę, że robienie niektórych projektów nauczy Cię znacznie więcej niż zrobienie pełnego kursu. Jednym z powodów jest to, że robienie projektu jest bardziej motywujące i otwarte niż wykonywanie zadań. Kurs, jeśli masz czas ORAZ motywację (prawdziwą motywację), jest lepszy niż robienie projektu. Inni komentatorzy wydali dobre rekomendacje platformy dotyczące technologii. Myślę, że z punktu widzenia projektu fajnego powinieneś zadać pytanie i zdobyć komputer, aby nauczył się odpowiadać. Niektóre dobre klasyczne pytania, które mają dobre przykłady, to:

* Sieci neuronowe do rozpoznawania odręcznych cyfr

* Klasyfikacja spamu przy użyciu regresji logistycznej

* Klasyfikacja obiektów za pomocą modeli mieszanin Gaussa

* Niektóre zastosowanie regresji liniowej, być może prognozowanie cen artykułów spożywczych w poszczególnych dzielnicach

Te projekty mają już zrobioną matematykę, zrobiony kod i można je łatwo znaleźć w Google. Możesz robić inne fajne tematy!

Na koniec zajmuję się robotyką, więc dla mnie najbardziej ZABAWNE aplikacje są behawioralne. Przykłady mogą obejmować (jeśli potrafisz bawić się arduino) Stwórz aplikację, która prawdopodobnie wykorzystuje regresję logistyczną, która uczy się, kiedy wyłączyć i włączyć wentylator, biorąc pod uwagę temperaturę wewnętrzną i stan światła w pomieszczeniu. Stwórz aplikację, która uczy robota poruszania siłownikiem, np. Kołem, na podstawie danych wejściowych z czujnika (np. Naciśnięcia przycisku), przy użyciu modeli mieszanin Gaussa (ucząc się z demonstracji). W każdym razie te są dość zaawansowane. Chodzi mi o to, że jeśli wybierzesz projekt, który (naprawdę) ci się podoba i spędzisz nad nim kilka tygodni, nauczysz się bardzo dużo i zrozumiesz o wiele więcej niż wykonanie kilku zadań.

Odpowiedź iliasfl Myślę, że Weka to dobry punkt wyjścia. Możesz zrobić wiele rzeczy, takich jak nadzorowane uczenie się lub grupowanie i łatwo porównać duży zestaw algorytmów z metodologiami. Podręcznik Weka to w rzeczywistości książka o uczeniu maszynowym i eksploracji danych, której można użyć jako materiału wprowadzającego

[43][Big Data] (2)

Zastosowania bazy danych NoSQL w nauce o danych

Jak można wykorzystać bazy danych NoSQL, takie jak MongoDB, do analizy danych? Jakie funkcje w nich mogą sprawić, że analiza danych będzie szybsza i skuteczniejsza?

Szczerze mówiąc, większość baz danych NoSQL nie nadaje się zbyt dobrze do zastosowań w dużych zbiorach danych. W przypadku większości aplikacji do obsługi dużych zbiorów danych wydajność MongoDB w porównaniu z relacyjną bazą danych, taką jak MySQL, jest na tyle niska, że ​​gwarantuje całkowite trzymanie się z dala od czegoś takiego jak MongoDB. Mając to na uwadze, istnieje kilka naprawdę przydatnych właściwości baz danych NoSQL, które z pewnością działają na twoją korzyść podczas pracy z dużymi zbiorami danych, chociaż prawdopodobieństwo tych korzyści przeważa ogólnie słabą wydajność NoSQL w porównaniu z SQL do odczytu intensywne operacje (najbardziej podobne do typowych przypadków użycia dużych zbiorów danych) są niskie.

* Brak schematu – jeśli pracujesz z dużą ilością nieustrukturyzowanych danych, podjęcie decyzji w sprawie schematu i sztywne zastosowanie go może być trudne. Bazy danych NoSQL w ogólności bardzo to wspierają i pozwalają na wstawianie dokumentów bez schematu w locie, co z pewnością nie jest czymś, co obsługuje baza danych SQL.

* JSON – jeśli pracujesz z dokumentami w stylu JSON zamiast z plikami CSV, zobaczysz dużą korzyść z używania czegoś takiego jak MongoDB jako warstwy bazy danych. Ogólnie rzecz biorąc, oszczędności związane z przepływem pracy nie przeważają jednak nad wydłużonymi czasami zapytań.

Łatwość obsługi – nie twierdzę, że bazy danych SQL są zawsze trudne w użyciu lub że Cassandra jest najłatwiejszą rzeczą na świecie, ale generalnie bazy danych NoSQL są łatwiejsze w konfiguracji i obsłudze niż bazy danych SQL. MongoDB jest tego szczególnie mocnym przykładem, znanym z tego, że jest jedną z najłatwiejszych w użyciu warstw bazy danych (poza SQLite). SQL radzi sobie także z normalizacją i istnieje spora część najlepszych praktyk SQL, które po prostu spowalniają proces programowania. Osobiście mogę zasugerować również sprawdzenie graficznych baz danych, takich jak Neo4j, które wykazują naprawdę dobrą wydajność dla niektórych typów zapytań, jeśli chcesz wybrać zaplecze dla aplikacji do nauki danych

Jedną z zalet podejścia NoSQL bez schematu jest to, że nie zatwierdzasz przedwcześnie i możesz zastosować odpowiedni schemat w czasie zapytania za pomocą odpowiedniego narzędzia, takiego jak Apache Drill. Zobacz tę prezentację po szczegóły. MySQL nie byłby moim pierwszym wyborem w kontekście dużych zbiorów danych.

Skalowalne wykrywanie wartości odstających / anomalii

Próbuję skonfigurować infrastrukturę Big Data przy użyciu Hadoop, Hive, Elastic Search (między innymi) i chciałbym uruchomić niektóre algorytmy na tych zbiorach danych. Chciałbym, żeby same algorytmy były skalowalne, co wyklucza używanie narzędzi takich jak Weka, R czy nawet RHadoop. Biblioteka Apache Mahout wydaje się być dobrą opcją i zawiera algorytmy dla zadań regresji i grupowania. To, co staram się znaleźć, to rozwiązanie do wykrywania anomalii lub wartości odstających. Ponieważ Mahout zawiera ukryte modele Markowa i różne techniki grupowania (w tym K-średnie), zastanawiałem się, czy byłoby możliwe zbudowanie modelu do wykrywania wartości odstających w szeregach czasowych, używając któregokolwiek z nich. Byłbym wdzięczny, gdyby ktoś z doświadczeniem w tej dziedzinie mógł mi doradzić a) jeśli to możliwe i jeśli jest b) jak to zrobić, plus c) oszacowanie nakładu pracy id) dokładność / problemy tego podejścia .

Przyjrzałbym się algorytmowi T-Digest. Został scalony z mahoutem, a także częścią niektórych innych bibliotek  do przesyłania strumieniowego dużych ilości danych .

Jak radzić sobie z kontrolą wersji dużych ilości (binarnych) danych

Jestem doktorantem geofizyki i pracuję z dużymi ilościami danych obrazowych (setki GB, dziesiątki tysięcy plików). Dość dobrze znam svn i git i doceniam historię projektu w połączeniu z możliwością łatwej współpracy i ochrony przed uszkodzeniem dysku. Uważam, że git jest również niezwykle pomocny w tworzeniu spójnych kopii zapasowych, ale wiem, że git nie może wydajnie obsługiwać dużych ilości danych binarnych. Podczas studiów magisterskich pracowałem na zestawach danych o podobnej wielkości (także obrazach) i miałem wiele problemów ze śledzeniem różnych wersji na różnych serwerach / urządzeniach. Rozróżnianie 100 GB w sieci naprawdę nie jest zabawne i kosztuje mnie dużo czasu i wysiłku. Wiem, że inni naukowcy mają podobne problemy, ale nie mogłem znaleźć dobrego rozwiązania. Chcę skorzystać z pamięci mojego instytutu, więc potrzebuję czegoś, co może korzystać z „głupiego” serwera. Chciałbym też mieć dodatkową kopię zapasową na przenośnym dysku twardym, ponieważ w miarę możliwości chciałbym uniknąć przesyłania setek GB przez sieć. Dlatego potrzebuję narzędzia, które może obsłużyć więcej niż jedną zdalną lokalizację. Wreszcie, naprawdę potrzebuję czegoś, z czego mogą korzystać inni badacze, więc nie musi to być super proste, ale powinno być możliwe do nauczenia się w ciągu kilku godzin. Oceniłem wiele różnych rozwiązań, ale żadne nie wydaje się pasować do rachunku: svn jest nieco nieefektywny i potrzebuje inteligentnego serwera hg bigfile / largefile może używać tylko jednego pilota git bigfile / media może również używać tylko jednego pilota, ale również nie jest zbyt wydajny. strych nie wydaje się mieć dziennika lub różnych możliwości bup wygląda naprawdę dobrze, ale potrzebuje do działania „inteligentnego” serwera. Próbowałem git-Annex, który robi wszystko, czego potrzebuję (i wiele więcej), ale jest bardzo trudny w użyciu i nie jest dobrze udokumentowany. Używałem go przez kilka dni i nie mogłem się tego obejść, więc wątpię, czy jakikolwiek inny współpracownik byłby zainteresowany. Jak badacze radzą sobie z dużymi zbiorami danych i czego używają inne grupy badawcze? Żeby było jasne, interesuje mnie przede wszystkim, jak inni badacze radzą sobie z tą sytuacją, a nie tylko ten konkretny zbiór danych. Wydaje mi się, że prawie każdy powinien mieć ten problem, ale nie znam nikogo, kto go rozwiązał. Czy powinienem po prostu zachować kopię zapasową oryginalnych danych i zapomnieć o całej tej kontroli wersji? Czy to właśnie robią wszyscy inni?

Miałem do czynienia z podobnymi problemami z bardzo dużymi zbiorami danych z biologii syntetycznej, gdzie mamy wiele, wiele GB danych cytometrii przepływowej rozrzuconych na wiele, wiele tysięcy plików i musimy je konsekwentnie utrzymywać między współpracującymi grupami w (wielu) różnych instytucjach. Typowa kontrola wersji, taka jak svn i git, nie jest praktyczna w takich okolicznościach, ponieważ po prostu nie jest zaprojektowana dla tego typu zbioru danych. Zamiast tego zaczęliśmy używać rozwiązań „przechowywania w chmurze”, w szczególności DropBox i Bittorrent Sync. DropBox ma tę zaletę, że wykonuje przynajmniej prymitywne logowanie i kontrolę wersji oraz zarządza serwerami za Ciebie, ale wadą jest to, że jest to usługa komercyjna, musisz zapłacić za dużą pamięć masową i umieszczasz swoje niepublikowane dane na komercyjne przechowywanie; nie musisz jednak dużo płacić, więc jest to opłacalna opcja. Bittorrent Sync ma bardzo podobny interfejs, ale uruchamiasz go samodzielnie na własnych serwerach pamięci masowej i nie ma on żadnej kontroli wersji. Oba zraniły moją duszę programisty, ale są to najlepsze rozwiązania, jakie moi współpracownicy i ja znaleźliśmy do tej pory.

Użyłem funkcji wersjonowania w zasobnikach Amazon S3 do zarządzania 10-100 GB w 10-100 plikach. Przesyłanie może być powolne, więc pomogło kompresować i przesyłać równolegle lub po prostu uruchamiać obliczenia na EC2. Biblioteka boto zapewnia przyjemny interfejs Pythona.

Spróbuj spojrzeć na Git Large File Storage (LFS). Jest nowy, ale warto się temu przyjrzeć. Jak widzę, dyskusja w Hacker News wspomina o kilku innych sposobach radzenia sobie z dużymi plikami:

* git-Annex (i np. używanie go z Amazon S3)

* Rozszerzenie Mercurual Largefiles

Co to jest „stara nazwa” naukowca danych?

Terminy takie jak „nauka o danych” i „naukowiec danych” są obecnie coraz częściej używane. Wiele firm zatrudnia „naukowców zajmujących się danymi”. Ale nie sądzę, żeby to była zupełnie nowa praca. Istnieją dane z przeszłości i ktoś miał do czynienia z danymi. Wydaje mi się, że termin „naukowiec danych” staje się bardziej popularny, ponieważ brzmi bardziej fantazyjnie i „seksownie”. Jak nazywano naukowców zajmujących się danymi w przeszłości?

W odwrotnym porządku chronologicznym: eksplorator danych, statystyka, matematyk (stosowany).

Terminy, które obejmowały mniej więcej te same tematy, które obejmuje dziś Data Science:

*Rozpoznawanie wzorców

*Nauczanie maszynowe

* Eksploracja danych

* Metody ilościowe

Myślę, że jest to nowa praca, w zasadzie analityk danych musi stosować algorytmy matematyczne do danych z dużymi ograniczeniami pod względem 1) Czas działania aplikacji 2) Wykorzystanie zasobów aplikacji. Gdyby tych ograniczeń nie było, nie nazwałbym pracy nauką o danych. Co więcej, algorytmy te często trzeba uruchamiać w systemach rozproszonych, co stanowi kolejny wymiar problemu. Oczywiście czyniono to już wcześniej, w pewnym połączeniu statystyki, matematyki i programowania, ale nie było to szeroko rozpowszechnione, aby zapoczątkować nowy termin. Prawdziwy wzrost nauki o danych wynika z możliwości gromadzenia dużych ilości danych, a zatem konieczności ich przetwarzania.

Odniesienie o eksploracji danych w sieciach społecznościowych

Nie zajmuję się nauką o danych, ale chciałbym dogłębnie zbadać tę dziedzinę, aw szczególności chciałbym rozpocząć od analizy danych z sieci społecznościowych. Próbuję znaleźć dobre referencje, zarówno papierowe, jak i strony internetowe, i książki, aby zacząć poznawać temat. W internecie można znaleźć wiele stron, forów, artykułów na ten temat, ale nie jestem w stanie rozróżnić dobrych i  złych lektur. Jestem użytkownikiem R, Matlab, SAS i znam trochę język Python. Czy mógłbyś zasugerować jakieś referencje, od których mógłbym zacząć studiować i pogłębiać branżę?

Moje ulubione miejsce, w którym można znaleźć informacje na temat analizy sieci społecznościowych, pochodzi z SNAP, Stanford Network Analysis Project. Zespół studentów i profesorów, kierowany przez Jure Leskovec, stworzył narzędzia programowe, zebrał zbiory danych i opublikował artykuły dotyczące analizy sieci społecznościowych. http://snap.stanford.edu/. Zbiór prac badawczych jest tam znakomity. Mają też narzędzie Python, które możesz wypróbować. http://snap.stanford.edu/snappy/index.html Skupiono się na analizie wykresów, ponieważ sieci społecznościowe dobrze pasują do tego modelu. Jeśli jesteś nowy , aby przeprowadzić analizę wykresów, proponuję wziąć udział w kursie matematyki dyskretnej na poziomie licencjackim lub zapoznać się z moją ulubioną książką na temat „Teoria wykresów z algorytmami i jej zastosowaniami” autorstwa Santanu Ray.

Aby zapoznać się z praktycznym podejściem do analizy sieci społecznościowych, zapoznaj się z „Mining the Social Web” autorstwa Matthew A Russella. Zawiera przykłady, które pokazują, jak zbierać i analizować dane z głównych sieci społecznościowych, takich jak Twitter, Facebook i LinkedIn. To Jure Leskovec początkowo podekscytował mnie tą dziedziną. Ma wiele świetnych prelekcji na YouTube.

Zamierzam kontynuować następującą serię kursów online na Coursera: Zostań naukowcem społecznym: metody i statystyki na Uniwersytecie w Amsterdamie. Dobra wiadomość – to nic nie kosztuje, albo możesz dostać ładnie wyglądający certyfikat za około 49 $. Zła wiadomość – najbliższa rejestracja to 31.08.2015. Będziesz miał okazję zdobyć dużo informacji w skondensowany sposób w krótkim czasie i będziesz zmuszony do faktycznego zastosowania wiedzy w ćwiczeniach, quizach i zadaniach projektowych. Będziesz miał również okazję omówić lekcje / projekty na forum z wieloma innymi studentami i wykładowcami.

Myślę, że Social Media Mining: An Introduction autor: Zafarani to doskonały punkt wyjścia. Dostępna jest również bezpłatna wersja PDF. Najpierw omawia podstawy teorii grafów i eksploracji danych. Obejmuje bardziej zaawansowane tematy w zakresie eksploracji wykresów, analizy sieci społecznościowych, systemów rekomendacji itp. Poza tym widziałem kilka kursów online w Coursera (przykład). Nie jestem jednak pewien ich jakości. Na koniec należy zauważyć, że analiza sieci społecznościowych to eksploracja danych dla danych z mediów społecznościowych, takich jak Facebook. To wcale nie jest nauka społeczna; to jest informatyka. Chociaż możesz w końcu pożyczyć od nich kilka pomysłów, to, co ostatecznie zrobisz, jest dalekie od tego, co robią ludzie z nauk społecznych. Tak więc przechodzenie przez kursy i książki z nauk społecznych prawdopodobnie nie jest w tym momencie dobrym pomysłem.

Jaki jest skuteczny sposób porównywania i grupowania milionów nazw sklepów?

Jestem całkowitym amatorem, jeśli chodzi o naukę o danych i próbuję znaleźć sposób na porównanie ciągów w dużym zbiorze danych. Mam tabelę Google BigQuery, w której są przechowywane transakcje handlowe, ale nazwy sklepów są na całej planszy. Na przykład może istnieć „Wal-Mart Super Center” i „Wal-Mart SC # 1234” lub „McDonalds F2222” i „McDonalds # 321”. To, co muszę zrobić, to zgrupować WSZYSTKIE „Wal-mart” i „McDonalds” i cokolwiek innego. Moje pierwsze podejście polegało na rekurencyjnym sprawdzeniu reg-ex, ale trwało to wieczność i ostatecznie minęło.

Jakie jest najlepsze podejście do zrobienia tego w przypadku tabeli zawierającej ponad 20 milionów wierszy? Jestem otwarty na wypróbowanie każdej technologii, która pasowałaby do tej pracy.

Jest to rozwiązanie encji, czyli powiązanie rekordów, czyli problem z dopasowaniem danych. Rozwiązałbym to, usuwając wszystkie niealfabetyczne znaki, w tym liczby, rzutując na wszystkie wielkie litery, a następnie stosując dopasowanie hierarchiczne. Najpierw dopasuj dokładne przypadki, a następnie przejdź do strzelania Levenshteina między polami. Podejmij jakąś decyzję o tym, jak duży wynik pozwoli uzyskać Levenshtein lub znormalizowany wynik Levenshtein, zanim stwierdzisz, że coś jest niezgodne. Przypisz każdemu wierszowi identyfikator, a gdy znajdziesz dopasowanie, ponownie przypisz niższy z identyfikatorów obu członkom dopasowania. Algorytm odległości Levenshteina jest prosty, ale genialny (wzięty stąd):

def levenshtein(a,b):

“Calculates the Levenshtein distance between a and b.”

n, m = len(a), len(b)

if n > m:

# Make sure n <= m, to use O(min(n,m)) space

a,b = b,a

n,m = m,n

current = range(n+1)

for i in range(1,m+1):

previous, current = current, [i]+[0]*n

for j in range(1,n+1):

add, delete = previous[j]+1, current[j-1]+1

change = previous[j-1]

if a[j-1] != b[i-1]:

change = change + 1

current[j] = min(add, delete, change)

return current[n]

Ta książka o dopasowywaniu danych jest dobrym źródłem i jest bezpłatna przez siedem dni w Amazon.

Nominalnie jest to algorytm bez wykorzystania niektórych wydajności sortowania, więc spodziewałbym się, że będę musiał używać wielu rdzeni w rzędach. Ale powinno to działać dobrze na 8-rdzeniowej instancji AWS. Ostatecznie zakończy się na jednym rdzeniu, ale może to zająć kilka godzin.

Naprawdę miałbym ochotę być leniwym i zastosować starą technologię do szybkiego i brudnego rozwiązania bez programowania, używając polecenia linux sort. To da ci listę posortowaną leksykograficznie. Jeśli nazwy sklepów nie są pierwszym polem, zmień ich kolejność lub powiedz sortowi, aby używał innego pola za pomocą przełącznika -k. Zapisz dane w zwykłym pliku tekstowym CSV, a następnie posortuj je:

$ sort myStores.csv> sortByStore.csv

Możesz pomóc sortować, przydzielając mu dużo pamięci, w tym przypadku 16 GB:

$ sort -S16G myStores.csv> sortByStore.csv

Możesz pójść dalej i utworzyć listę unikalnych nazw sklepów i liczby ich wystąpień, aby pomóc Ci zrozumieć, jak wyglądają dane:

$ sort -S16G myStores.csv | wytnij -f1 -d, | uniq -c> storeIdsAndCounts.csv

Lub unikaj uciekania się i posiadaj tylko unikalne identyfikatory:

$ cat sortByStore.csv | wytnij -f1 -d, | uniq> storeIds.csv

Oryginalne znaczenie „Inteligencji” w „Business Intelligence”

Co pierwotnie oznacza termin „Intelligence” w „Business Intelligence”? Czy oznacza to użyte w „Sztucznej inteligencji” czy w „Agencji Wywiadu”? Innymi słowy, czy „Business Intelligence” oznacza: „Działaj mądrze i inteligentnie w biznesie” czy „Gromadzenie danych i informacji o firmie”? To pytanie było tematem debaty między niektórymi członkami naszego zespołu nauk o danych, więc pomyślałem, że zapytam o nie innych ekspertów. Można by powiedzieć, że oba znaczenia mają zastosowanie, ale proszę o pierwotne zamierzone znaczenie tego słowa, jak zaproponowano w latach osiemdziesiątych. Akceptowalna odpowiedź powinna zdecydowanie cytować oryginalne odniesienia, a osobiste opinie nie są tym, czego szukam.

Uważa się, że Howard Dresner w 1989 r. Ukuł termin „Business Intelligence”, aby opisać „koncepcje i metody usprawnienia podejmowania decyzji biznesowych przy użyciu systemów wsparcia opartych na faktach”. Kiedy był w Gartner Group. To powszechna mantra rozpowszechniana w sieci. Nie udało mi się jeszcze znaleźć dokładnego źródła tego pochodzenia. Wielu twierdzi, że nie był w grupie Gartnera w 1989 roku, co potwierdza poniższy wywiad. W swojej książce z 2008 r. „Rewolucja w zarządzaniu wydajnością: poprawa wyników dzięki widoczności i wgląd w działania, termin jest definiowany jako:

BI to wiedza zdobyta dzięki dostępowi i analizie informacji biznesowych.

Streszczenie: Opracowywany jest automatyczny system rozpowszechniania informacji do różnych sekcji dowolnej organizacji przemysłowej, naukowej lub rządowej. Ten inteligentny system będzie wykorzystywał maszyny przetwarzające dane do auto-abstrakcji i automatycznego kodowania dokumentów oraz do tworzenia profili zainteresowań dla każdego z „punktów akcji” w organizacji. Zarówno dokumenty przychodzące, jak i generowane wewnętrznie są automatycznie abstrakcyjne, charakteryzowane za pomocą wzorca słów i wysyłane automatycznie do odpowiednich punktów akcji. W artykule przedstawiono elastyczność takiego systemu w identyfikowaniu znanych informacji, znajdowaniu, kto powinien je znać, oraz w rozpowszechnianiu skutecznie, albo w formie abstrakcyjnej, albo jako kompletny dokument. Autor twierdzi, że: Techniki proponowane tutaj, aby to umożliwić to:

  1. Autoabstrakcja dokumentów;
  2. Automatyczne kodowanie dokumentów;
  3. Automatyczne tworzenie i aktualizowanie profili punktów akcji.

Wszystkie te techniki opierają się na procedurach statystycznych, które można wykonać na współczesnych maszynach do przetwarzania danych. Wraz z odpowiednim wyposażeniem komunikacyjnym i sprzętem wejścia-wyjścia można zbudować kompleksowy system, aby uwzględnić wszystkie problemy informacyjne organizacji. Nazywamy to Biznesowym Systemem Inteligencji. Podaje również wyjaśnienie terminów „biznes” i „wywiad”: w tym artykule biznes jest zbiorem działań prowadzonych w jakimkolwiek celu, czy to w nauce, technologii, handlu, przemyśle, prawie, rządzie, obronie itd. . Urządzenie komunikacyjne służące do prowadzenia biznesu (w szerokim znaczeniu) można nazwać systemem wywiadowczym. Pojęcie inteligencji jest tu również definiowane, w bardziej ogólnym sensie, jako „umiejętność uchwycenia wzajemnych powiązań przedstawionych faktów w taki sposób, aby kierować działaniami do pożądanego celu”. Zatem idea „powiązania faktów” jest już obecna w artykule H. P. Luhna. Według wielu źródeł, Howard Dresner ponownie wynalazł „Business Intelligence”, aby zmienić system wspomagania decyzji marki (DSS) i system informacji kierowniczej (EIS), gdy był zatrudniony w DEC, a termin ten stał się sławny dzięki wpływowi grupy Gartner. Najwyraźniej termin ten był już używany znacznie wcześniej, jak w książce Wholesale Business Intelligence and Southern and Western Merchants ‘Pocket Directory to the Principal Mercantile Houses in the City of Philadelphia, na rok 1839. Ponieważ nie mogłem pobrać tego źródła, będę trzymać się akceptacji Luhna / Dresnera. Odnosi się do etymologii inteligencji: późny XIV w. „Zdolność rozumienia”, od starofrancuskiej inteligencji (12c.), Od łacińskiej inteligencja, inteligencja „rozumienie, moc rozeznawania; sztuka, umiejętność, gust ”, od Intelligem (mianownik inteligencji),„ rozeznający ”, obecny imiesłów inteligencji,„ rozumieć, rozumieć ”, od między-„ między ”(patrz inter-) + legere„ wybierać, wybierać

Wywiad wojskowy:

Definicja Business Intelligence: doświadczenie CIA nie jest wymagane Więc czym do cholery jest wywiad biznesowy? W istocie BI to dowolne działanie, narzędzie lub proces służący do uzyskiwania najlepszych informacji wspierających proces podejmowania decyzji. Dla naszych celów BI obraca się wokół wykorzystania mocy obliczeniowej (wysoce wyspecjalizowanego oprogramowania w połączeniu z innymi, bardziej powszechnymi zasobami technologicznymi), aby pomóc w dokonywaniu najlepszych wyborów dla Twojej organizacji. Analiza biznesowa jest zasadniczo aktualna, dokładna, wartościowa i możliwa do wykonania spostrzeżenia biznesowe oraz procesy pracy i technologie wykorzystywane do ich uzyskania. Dlatego skłaniałbym się ku „zbieraniu danych i informacji o biznesie”, a może bardziej „w celu lepszego prowadzenia biznesu”. Dodatkowe uwagi historyczne można znaleźć w dziale Ojciec BI? Czy on się śmieje ?!

[43][Big Data](1)

PYTANIA :

Jak duże są duże zbiory danych?

Wiele osób używa terminu big data w raczej komercyjny sposób, aby wskazać, że w obliczeniach zaangażowane są duże zbiory danych, a zatem potencjalne rozwiązania muszą mieć dobrą wydajność. Oczywiście duże zbiory danych zawsze mają powiązane terminy, takie jak skalowalność i wydajność, ale co dokładnie definiuje problem jako problem dużych zbiorów danych? Czy obliczenia muszą być związane z jakimś zestawem konkretnych celów, takich jak eksploracja danych / wyszukiwanie informacji, czy też algorytm ogólnych problemów z grafami można nazwać dużymi danymi, jeśli zestaw danych byłby wystarczająco duży? Poza tym, jak duże jest wystarczająco duże (jeśli można to określić)?

Dla mnie (wywodzę się z relacyjnej bazy danych), „Big Data” nie dotyczy przede wszystkim rozmiaru danych (czyli większości tego, co dotychczas dotyczyło innych odpowiedzi). „Big Data” i „Bad Data” są ze sobą ściśle powiązane. Relacyjne bazy danych wymagają „nieskazitelnych danych”. Jeśli dane znajdują się w bazie danych, są dokładne, czyste i w 100% wiarygodne. Relacyjne bazy danych wymagają „świetnych danych” oraz poświęcenia ogromnej ilości czasu, pieniędzy i odpowiedzialności, aby upewnić się, że dane są dobrze przygotowane przed załadowaniem ich do bazy danych. Jeśli dane znajdują się w bazie danych, są to „ewangelie”, które definiują systemowe rozumienie rzeczywistości. „Big Data” rozwiązuje ten problem z innej strony. Dane są słabo zdefiniowane, wiele z nich może być niedokładnych, a wielu może faktycznie brakować. Struktura i układ danych są liniowe, a nie relacyjne. Big Data musi mieć wystarczającą ilość, aby ilość złych lub brakujących danych stała się statystycznie nieistotna. Kiedy błędy w danych są na tyle powszechne, że wykluczają się wzajemnie, a brakujące dane są proporcjonalnie na tyle małe, że można je pominąć. Kiedy Twoje wymagania i algorytmy dostępu do danych działają nawet przy niekompletnych i niedokładnych danych, masz „Big Data”. W „Big Data” tak naprawdę nie chodzi o ilość, chodzi o charakterystykę danych.

Jak słusznie zauważyłeś, w dzisiejszych czasach „duże zbiory danych” to coś, co każdy chce powiedzieć, że ma, co pociąga za sobą pewną luźność w definiowaniu tego terminu. Ogólnie rzecz biorąc, powiedziałbym, że z pewnością masz do czynienia z dużymi zbiorami danych, jeśli skala jest taka, że ​​nie jest już możliwe aby radzić sobie z bardziej tradycyjnymi technologiami, takimi jak RDBMS, przynajmniej bez uzupełniania ich technologiami Big Data, takimi jak Hadoop. Jak duże muszą być Twoje dane, aby tak się stało, jest dyskusyjne. Oto (nieco prowokacyjny) post na blogu, w którym stwierdzono, że tak naprawdę nie jest w przypadku mniej niż 5 TB danych. (Żeby było jasne, nie stwierdza się, że „mniej niż 5 TB to nie duże zbiory danych”, ale po prostu „mniej niż 5 TB to za mało, abyś potrzebował Hadoop”). Ale nawet w przypadku mniejszych zbiorów danych technologie Big Data podobnie jak Hadoop, może mieć inne zalety, w tym być dobrze przystosowanym do operacji wsadowych, dobrze bawić się danymi nieustrukturyzowanymi (a także danymi, których struktura nie jest znana z góry lub może się zmienić), skalowalność poziomą (skalowanie poprzez dodawanie większej liczby węzłów zamiast wzmacniania Twoje istniejące serwery) i (jako jeden z komentujących w notatkach do postów, do których prowadzi powyższy link) możliwość integracji przetwarzania danych z zewnętrznymi zbiorami danych (pomyśl o map-reduku, w którym mapper wykonuje wywołanie innego serwera). Inne technologie związane z dużymi zbiorami danych, takie jak bazy danych NoSql, kładą nacisk na szybką wydajność i stałą dostępność podczas obsługi dużych zbiorów danych, a także możliwość obsługi danych częściowo nieustrukturyzowanych i skalowania w poziomie. Oczywiście tradycyjne RDBMS mają swoje zalety, w tym gwarancje ACID (atomowość, spójność, izolacja, trwałość) i lepszą wydajność dla niektórych operacji, a także są bardziej znormalizowane, bardziej dojrzałe i (dla wielu użytkowników) bardziej znane. Dlatego nawet w przypadku bezsprzecznie „dużych” danych sensowne może być załadowanie przynajmniej części danych do tradycyjnej bazy danych SQL i wykorzystanie ich w połączeniu z technologiami dużych zbiorów danych. Tak więc, bardziej hojna byłaby definicja, że ​​masz duże zbiory danych, o ile są one na tyle duże, że technologie dużych zbiorów danych zapewniają pewną wartość dodaną. Ale jak widać, może to zależeć nie tylko od rozmiaru danych, ale także od tego, jak chcesz z nimi pracować i jakie masz wymagania w zakresie elastyczności, spójności i wydajności. To, w jaki sposób wykorzystujesz swoje dane, jest bardziej istotne dla pytania niż do czego ich używasz (np. Eksploracja danych). To powiedziawszy, zastosowania takie jak eksploracja danych i uczenie maszynowe z większym prawdopodobieństwem przyniosą użyteczne wyniki, jeśli masz wystarczająco duży zestaw danych do pracy.

Całkowita ilość danych na świecie: 2,8 zetabajtów w 2012 r., Szacowana na 8 zetabajtów do 2015 r., z czasem podwojenia wynoszącym 40 miesięcy. Nie może być większe 🙂 Jako przykład pojedynczej dużej organizacji, Facebook pobiera 500 terabajtów dziennie do magazynu o wielkości 100 petabajtów i wykonuje 70 tys. zapytań dziennie od 2012 r. Ich obecny magazyn to > 300 petabajtów. Big data to prawdopodobnie dobry ułamek liczb na Facebooku (1/100 prawdopodobnie tak, 1/10000 prawdopodobnie nie: to widmo, a nie pojedyncza liczba). Oprócz rozmiaru, niektóre z funkcji, które sprawiają, że jest duży, to:

* jest aktywnie analizowany, a nie tylko przechowywany (cytat „Jeśli nie korzystasz z dużych zbiorów danych, to nie masz dużych zbiorów danych, masz tylko stos danych”

 * budowa i prowadzenie hurtowni danych to duży projekt infrastrukturalny

* rośnie w znacznym tempie

* nie ma struktury lub ma nieregularną strukturę

Definicja firmy Gartner: „Duże zbiory danych to duże ilości danych, szybkie i / lub różnorodne zasoby informacyjne, które wymagają nowych form przetwarzania” (3V). Dlatego też uważają, że „ogrom” nie dotyczy wyłącznie rozmiaru zbioru danych, ale także o prędkości i strukturze oraz rodzaju potrzebnych narzędzi.

Czy język R jest odpowiedni dla Big Data

R ma wiele bibliotek, które są przeznaczone do analizy danych (np. JAGS, BUGS, ARULES itp.) I jest wymieniany w popularnych podręcznikach. Widziałem wytyczne dotyczące 5 TB dla zbioru danych, który można uznać za Big Data. Moje pytanie brzmi: czy R jest odpowiedni dla ilości danych typowych dla problemów związanych z Big Data? Czy istnieją strategie, które należy zastosować podczas korzystania z języka R z zestawem danych o takim rozmiarze?

Właściwie to się zbliża. Jest kilka obejść, które należy wykonać, ponieważ R wykonuje całą swoją pracę w pamięci, więc zasadniczo ogranicza się ilość pamięci RAM, którą masz do dyspozycji. Dojrzały projekt dla R i Hadoop to RHadoop RHadoop został podzielony na kilka podprojektów, rhdfs, rhbase, rmr2, plyrmr i quickcheck (wiki).

Głównym problemem związanym z używaniem języka R dla dużych zestawów danych jest ograniczenie pamięci RAM. Powodem przechowywania wszystkich danych w pamięci RAM jest to, że zapewnia znacznie szybszy dostęp i przetwarzanie danych niż przechowywanie na dyskach twardych. Jeśli chcesz poprawić wydajność, to tak, praca z dużymi zbiorami danych w języku R jest dość praktyczna.

Pakiet RODBC: umożliwia połączenie z zewnętrzną bazą danych z R w celu pobierania i obsługi danych. W związku z tym manipulowane dane są ograniczone do pamięci RAM. Ogólny zestaw danych może być znacznie większy. Pakiet ff umożliwia korzystanie z zestawów danych większych niż pamięć RAM, wykorzystując strony mapowane w pamięci.

BigLM: buduje uogólnione modele liniowe w oparciu o duże zbiory danych. Ładuje dane do pamięci w fragmentach.

bigmemory: pakiet R, który umożliwia wydajne i wydajne pod względem pamięci równoległe analizy i eksplorację ogromnych zestawów danych. Umożliwia przechowywanie dużych obiektów (matryc itp.) W pamięci (w pamięci RAM) przy użyciu zewnętrznych obiektów wskaźnikowych w celu odniesienia się do nich.

R doskonale nadaje się do „dużych zbiorów danych”! Potrzebujesz jednak przepływu pracy, ponieważ R jest ograniczony (z pewnym uproszczeniem) przez ilość pamięci RAM w systemie operacyjnym. Podejście, które stosuję, polega na interakcji z relacyjną bazą danych (zobacz pakiet RSQLite do tworzenia i interakcji z bazą danych SQLite), uruchamianiu zapytań w stylu SQL w celu zrozumienia struktury danych, a następnie wyodrębnianiu poszczególnych podzbiorów danych do celów obliczeniowych- intensywna analiza statystyczna. To tylko jedno podejście: istnieją pakiety, które umożliwiają interakcję z innymi bazami danych (np. Monet) lub uruchamianie analiz w języku R z mniejszymi ograniczeniami pamięci (np. Patrz pbdR).

 Kiedy wartości p są mylące?

Na jakie warunki dotyczące danych powinniśmy uważać, gdzie wartości p mogą nie być najlepszym sposobem decydowania o istotności statystycznej? Czy istnieją określone typy problemów, które należą do tej kategorii?

Pytasz o pogłębianie danych, co dzieje się podczas testowania bardzo dużej liczby hipotez w zestawie danych lub testowania hipotez w odniesieniu do zestawu danych, które zostały zasugerowane przez te same dane. W szczególności sprawdź hazard z wieloma hipotezami i testowanie hipotez sugerowanych przez dane. Rozwiązaniem jest użycie pewnego rodzaju korekty współczynnika fałszywych odkryć lub współczynnika błędów Familywise, na przykład metody Scheffégo lub (bardzo starej) poprawki Bonferroniego. W nieco mniej rygorystyczny sposób może pomóc filtrowanie odkryć według przedziału ufności dla ilorazu szans (OR) dla każdego wyniku statystycznego. Jeśli 99-procentowy przedział ufności dla ilorazu szans wynosi 10-12, to OR jest <= 1 z bardzo małym prawdopodobieństwem, zwłaszcza jeśli wielkość próby jest również duża. Jeśli znajdziesz coś takiego, prawdopodobnie jest to silny efekt, nawet jeśli wyszedł z testu milionów hipotez.

Nie powinieneś rozważać wartości p poza kontekstem. Jedną raczej podstawową kwestią (jak ilustruje xkcd) jest to, że musisz rozważyć, ile testów, które faktycznie przeprowadzasz. Oczywiście nie należy być zszokowanym, widząc p <0,05 dla jednego na 20 testów, nawet jeśli hipoteza zerowa za każdym razem jest prawdziwa. Bardziej subtelny przykład tego występuje w fizyce wysokich energii i jest znany jako efekt patrzenia gdzie indziej. Im większą przestrzeń parametrów szukasz sygnału, który może reprezentować nową cząstkę, tym większe jest prawdopodobieństwo, że zobaczysz pozorny sygnał, który w rzeczywistości jest wynikiem przypadkowych fluktuacji.

Jedną rzeczą, o której powinieneś wiedzieć, jest wielkość próbki, której używasz. Bardzo duże próbki, takie jak ekonomiści korzystający z danych ze spisu powszechnego, doprowadzą do deflowanych wartości p.

Który stos technologii Big Data najlepiej nadaje się do przetwarzania tweetów, wyodrębnianie / rozwijanie adresów URL i wysyłanie (tylko) nowych linków do systemu innej firmy?

Uważam, że rozumiem ogólny cel pytania, w wyniku czego prawdopodobnie będę w stanie odpowiedzieć na wszelkie pytania, które mogą pop-up.) Który stos technologii Big Data najlepiej nadaje się do przetwarzania tweetów, wyodrębniania / rozszerzania adresów URL i wysyłania (tylko) nowych linków do systemu innej firmy? Proponuję Apache Kafka jako magazyn wiadomości i dowolne wybrane rozwiązanie do przetwarzania strumieni, takie jak Apache Camel lub Twitter Storm

W jaki sposób zapytanie do ogromnej bazy danych powraca z pomijalnym wynikiem czasu oczekiwania?

Na przykład podczas wyszukiwania czegoś w Google wyniki zwracają się niemal natychmiast. Rozumiem, że Google sortuje i indeksuje strony za pomocą algorytmów itp., Ale wyobrażam sobie, że nie jest możliwe indeksowanie wyników każdego możliwego zapytania (a wyniki są spersonalizowane, co czyni to jeszcze bardziej niewykonalnym)? Co więcej, czy opóźnienie sprzętowe w sprzęcie Google nie byłoby ogromne? Nawet jeśli dane w Google wszystkie były przechowywane na dyskach SSD TB / s, wyobrażam sobie, że opóźnienie sprzętowe jest ogromne, biorąc pod uwagę samą ilość danych do przetworzenia.

Czy MapReduce pomaga rozwiązać ten problem?

EDYCJA: OK, więc rozumiem, że popularne wyszukiwania można przechowywać w pamięci. Ale co z niepopularnymi wyszukiwaniami? Nawet w przypadku najbardziej niejasnego wyszukiwania, jakie przeprowadziłem, nie sądzę, aby było ono kiedykolwiek zgłaszane jako dłuższe niż 5 sekund. Jak to jest możliwe?

MapReduce nie ma nic wspólnego z działaniem w czasie rzeczywistym. Jest to platforma przetwarzania zorientowana na partię, odpowiednia dla niektórych zadań offline, takich jak ETL i tworzenie indeksów. Google wycofał się z MapReduce w większości zadań, a nawet ekosystem Hadoop robi to podobnie. Odpowiedzią na małe opóźnienie jest zazwyczaj przechowywanie w pamięci wstępnie obliczonych wskaźników. Wszystko, co dotyka dysku, jest trudne do wykonania szybko i na dużą skalę. W ten sposób silniki SQL nowej generacji oparte na Hadoop, takie jak Impala, uzyskują tak dużą prędkość w porównaniu do opartych na MapReduce na przykład infrastruktura, taka jak Hive. Infrastruktura wyszukiwania nie może buforować wyników każdego zapytania. Ale z pewnością może buforować wyniki pośrednie lub bardziej kompletne wyniki dla najpopularniejszych zapytań. Przy odrobinie buforowania możesz podawać wyniki dla znacznej mniejszości wszystkich zapytań. Wyszukiwanie jest również podzielone na serwery. Tak więc jedna maszyna może delegować do 100, aby uzyskać część wyniku, a następnie połączyć je. Możesz także uciec z pewnym stopniem przybliżenia. Google nie tworzy dosłownie tysiąca stron wyników wyszukiwania; wystarczy, że pierwsza strona będzie prawidłowa. Pamiętaj, że Google ma miliony komputerów na całym świecie. Twoje zapytania trafiają do centrum danych, które znajduje się w pobliżu Ciebie i obsługuje tylko Twoją lokalizację. Eliminuje to większość opóźnień, które są związane z siecią, a nie czasem przetwarzania w centrum danych.

MapReduce nie jest używane do wyszukiwania. Został użyty dawno temu do budowy indeksu; ale jest to platforma przetwarzania wsadowego, a większość sieci nie zmienia się cały czas, więc nowsze architektury mają charakter przyrostowy, a nie wsadowy. Wyszukiwanie w Google będzie w dużej mierze działać tak samo, jak w Lucene i Elastic Search, z wyjątkiem wielu precyzyjnie dostrojonych dodatkowych obciążeń i optymalizacji. Ale w głębi serca użyją jakiejś formy odwróconego indeksu. Innymi słowy, nie przeszukują kilku terabajtów po wpisaniu zapytania wyszukiwania (nawet jeśli nie jest ono zapisane w pamięci podręcznej). Prawdopodobnie w ogóle nie patrzą na rzeczywiste dokumenty. Ale używają tabeli odnośników, która zawiera listę dokumentów pasujących do zapytania (z preprocesorami, błędami pisowni, synonimami itp.). Prawdopodobnie pobierają listę 10000 najpopularniejszych dokumentów dla każdego słowa (10 tys. Liczb całkowitych – tylko kilka kb!) I obliczają na jej podstawie najlepsze dopasowania. Tylko jeśli na tych listach nie ma dobrych dopasowań, rozwijają się one do następnych takich bloków itp. Zapytania dotyczące typowych słów można łatwo przechowywać w pamięci podręcznej; dzięki wstępnemu przetwarzaniu możesz zbudować listę 10k najlepszych wyników, a następnie uporządkować je zgodnie z profilem użytkownika. Nie ma też nic do zyskania obliczając „dokładną” odpowiedź. Spojrzenie na pierwszych 10 000 wyników jest prawdopodobnie wystarczające; nie ma poprawnej odpowiedzi; a jeśli lepszy wynik gdzieś na pozycji 10001 zostanie pominięty, nikt nie będzie wiedział ani nie zauważył (ani nie przejmował się). Prawdopodobnie został już w rankingu niżej w przetwarzaniu wstępnym i nie znalazłby się w pierwszej 10, która jest prezentowana użytkownikowi na końcu (lub w pierwszej trójce, na którą faktycznie patrzy użytkownik). Z drugiej strony rzadkie terminy nie są zbyt popularne wyzwanie – jedna z list zawiera tylko kilka pasujących dokumentów, a wszystkie pozostałe możesz od razu odrzucić.

Gdy relacyjna baza danych ma lepszą wydajność niż nie relacyjne

Kiedy relacyjna baza danych, taka jak mySQL, ma lepszą wydajność niż nierelacyjna, taka jak mongo? Widziałem kiedyś pytanie na Quorze, dlaczego Quora nadal używa mySQL jako swojego zaplecza. I jak ich wydajność jest nadal dobra.

To zależy od Twoich danych i tego, co z nimi robisz. Na przykład, jeśli przetwarzanie, które musisz wykonać, wymaga synchronizacji transakcji między węzłami, prawdopodobnie szybsze będzie użycie transakcji zaimplementowanych w RDBMS niż samodzielne implementowanie ich na bazach danych NoSQL, które nie obsługują go natywnie.

Dlaczego trudno jest zapewnić wydajność podczas korzystania z bibliotek?

Każde przetwarzanie małej bazy danych może być łatwo rozwiązane przez skrypty Python / Perl /…, które używają bibliotek i / lub nawet narzędzi z samego języka. Jednak jeśli chodzi o wydajność, ludzie zwykle sięgają po języki C / C ++ / niskiego poziomu. Możliwość dostosowania kodu do potrzeb wydaje się być tym, co czyni te języki tak atrakcyjnymi dla BigData – czy to w odniesieniu do zarządzania pamięcią, równoległości, dostępu do dysku, czy nawet optymalizacji niskiego poziomu (poprzez konstrukcje asemblacyjne na poziomie C / C ++). Oczywiście taki zestaw korzyści nie obywałby się bez kosztów: pisanie kodu, a czasem nawet wymyślanie na nowo koła, może być dość drogie / męczące. Chociaż dostępnych jest wiele bibliotek, ludzie mają skłonność do samodzielnego pisania kodu, gdy tylko potrzebują wydajności. Co uniemożliwia asercjom wydajności korzystanie z bibliotek podczas przetwarzania dużych baz danych? Na przykład rozważmy przedsiębiorstwo, które nieustannie przeszukuje strony internetowe i analizuje zebrane dane. Dla każdego przesuwanego okna na wyodrębnionych danych są uruchamiane różne algorytmy eksploracji danych. Dlaczego programiści mieliby zrezygnować z korzystania z dostępnych bibliotek / frameworków (czy to do indeksowania, przetwarzania tekstu i eksploracji danych)? Korzystanie z już zaimplementowanych rzeczy nie tylko zmniejszyłoby ciężar kodowania całego procesu, ale także zaoszczędziłoby dużo czasu.

W jednym ujęciu:

* co sprawia, że ​​samodzielne napisanie kodu jest gwarancją wykonania?

* dlaczego poleganie na frameworkach / bibliotekach jest ryzykowne, skoro musisz zapewnić wysoką wydajność?

Nie sądzę, żeby wszyscy sięgali po C/C++, gdy problemem była wydajność. Zaletą pisania kodu niskiego poziomu jest użycie mniejszej liczby cykli procesora lub czasami mniej pamięci. Ale chciałbym zauważyć, że języki wyższego poziomu mogą odwoływać się do języków niższego poziomu i robią to, aby uzyskać część tej wartości. Języki Python i JVM mogą to zrobić. Naukowiec zajmujący się danymi, korzystający na przykład ze scikit-learn na swoim komputerze, już wywołuje mocno zoptymalizowane natywne procedury, aby wykonać obliczenia. Nie ma sensu pisać nowego kodu szybkości. W kontekście rozproszonych „dużych zbiorów danych” częściej stanowisz wąskie gardło w przenoszeniu danych:

transfer sieciowy i I / O. Kod natywny nie pomaga. Pomaga nie pisanie tego samego kodu, aby działał szybciej, ale pisanie mądrzejszego kodu. Języki wyższego poziomu pozwolą Ci zaimplementować bardziej wyrafinowane rozproszone algorytmy w danym czasie programisty niż C / C ++. Na dużą skalę inteligentniejszy algorytm zapewniający lepszy przepływ danych pokona głupi kod natywny. Zwykle jest też prawdą, że czas programisty i błędy kosztują dużo więcej niż nowy sprzęt. Rok starszego programisty może być w pełni obciążony 200 000 USD; ponad rok, który również wynajmuje setki serwerów na czas obliczeniowy. W większości przypadków po prostu nie ma sensu zawracać sobie głowy optymalizacją, zamiast rzucać więcej sprzętu. Nie rozumiem dalszych informacji na temat „przyznania”, „wyłączenia” i „potwierdzenia”?

Jak wszyscy wiemy, w świecie cyfrowym jest wiele sposobów na wykonanie tej samej pracy / uzyskanie oczekiwanych rezultatów. A odpowiedzialność / ryzyko wynikające z kodu spoczywa na barkach programistów. Jest to małe, ale myślę, że bardzo przydatny przykład z Świat .NET .. Tak wielu programistów .NET używa wbudowanego BinaryReader – BinaryWriter do serializacji danych w celu uzyskania wydajności / uzyskania kontroli nad procesem. To jest kod źródłowy CSharp wbudowanej w FrameWork klasy BinaryWriter.

przeciążone metody zapisu:

// Zapisuje wartość logiczną do tego strumienia. W strumieniu zapisywany jest pojedynczy bajt

// z wartością 0 reprezentującą fałsz lub wartością 1 reprezentującą prawdę.

//

public virtual void Write (wartość bool)

{

// Bufor _ to tablica bajtów zadeklarowana w kodach ctor / init klasy

_buffer = ((bajt) (wartość? 1: 0));

// OutStream to instancja strumienia, do której BinaryWriter zapisuje wartości.

OutStream.WriteByte (_buffer [0]);

}

Jak widać, ta metoda mogłaby zostać napisana bez dodatkowego przypisywania do zmiennej _buffer:

public virtual void Write (wartość bool)

{

OutStream.WriteByte ((bajt) (wartość? 1: 0));

}

Bez przypisywania moglibyśmy zyskać kilka milisekund… Te kilka milisekund można zaakceptować jako „prawie nic”, ale co, jeśli jest wiele tysięcy zapisów (tj. W procesie serwera)? Załóżmy, że „kilka” to 2 (milisekundy), a wiele tysięcy wystąpień to tylko 2 000 .. Oznacza to 4 sekundy więcej czasu przetwarzania..4 sekundy później powrót .. Jeśli nadal będziemy tematować z .NET i czy możesz sprawdzić kody źródłowe BCL – .NET Base Class Library – z MSDN widać wiele strat wydajności ze strony dewelopera.

Dowolny punkt ze źródła BCL To normalne, że programista zdecydował się na użycie pętli while() lub foreach(), które mogłyby zaimplementować szybszą pętlę for() w swoim kodzie. Te małe zyski dają nam całkowitą wydajność .. A jeśli wrócimy do metody BinaryWriter.Write() .. W rzeczywistości dodatkowe przypisanie do implementacji _buffer nie jest błędem nadrzędnym… To jest właśnie decyzja o „pozostaniu w bezpiecznym miejscu”! Załóżmy, że zdecydowaliśmy się nie używać _buffer i zdecydowaliśmy się zaimplementować drugą metodę. Jeśli spróbujemy wysłać wiele tysięcy bajtów przez przewód (tj. Załadować / pobrać dane BLOB lub CLOB) drugą metodą, może się to nie udać, ponieważ utraty połączenia, ponieważ staramy się przesyłać wszystkie dane bez żadnych sprawdzeń i mechanizmów kontrolnych. W przypadku utraty połączenia, zarówno serwer, jak i Klient nigdy nie wiedzą, czy wysłane dane są kompletne, czy nie. Jeśli deweloper zdecyduje się „pozostać bezpiecznym”, zwykle oznacza to, że koszty wydajności zależą od zaimplementowanego mechanizmu (ów) „pozostań bezpieczny”. Ale jeśli programista zdecyduje się „podejść ryzykownie, zwiększyć wydajność”, to również nie jest wada… Do czasu, gdy pojawiają się dyskusje na temat „ryzykownego” kodowania. Mała uwaga: deweloperzy bibliotek komercyjnych zawsze starają się zachować bezpieczeństwo, ponieważ nie wiedzą, gdzie ich kod będzie używany.

Z punktu widzenia programistów frameworki rzadko traktują wydajność jako najwyższy priorytet. Jeśli Twoja biblioteka będzie szeroko wykorzystywana, ludzie będą prawdopodobnie najbardziej cenić łatwość użytkowania, elastyczność i niezawodność. Wydajność jest generalnie ceniona w drugorzędnych konkurencyjnych bibliotekach. „Biblioteka X jest lepsza, ponieważ jest szybsza”. Nawet wtedy bardzo często te biblioteki będą wymieniać najbardziej optymalne rozwiązanie na takie, które można szeroko wykorzystać. Korzystając z dowolnego frameworka, nieodłącznie ryzykujesz, że istnieje szybsze rozwiązanie. Mógłbym nawet powiedzieć, że prawie zawsze istnieje szybsze rozwiązanie. Samo napisanie czegoś nie jest gwarancją wydajności, ale jeśli wiesz, co robisz i masz dość ograniczony zestaw wymagań, może to pomóc. Przykładem może być analiza JSON. Istnieją setki bibliotek dla różnych języków, które zmienią JSON w obiekt, do którego można się odwoływać i na odwrót. Znam jedną implementację, która robi to wszystko w rejestrach procesora. Jest wymiernie szybszy niż wszystkie inne parsery, ale jest też bardzo ograniczony, a to ograniczenie będzie się różnić w zależności od tego, z jakim procesorem pracujesz. Czy zadanie tworzenia wysokowydajnego parsera JSON specyficznego dla środowiska to dobry pomysł? Wykorzystałbym szanowaną bibliotekę 99 razy na 100. W tym jednym oddzielnym przypadku kilka dodatkowych cykli procesora pomnożonych przez milion iteracji sprawiłoby, że czas rozwoju byłby tego wart.

Kompromisy między Storm a Hadoop (MapReduce)

Czy ktoś uprzejmie może mi powiedzieć o kompromisach związanych z wyborem między Storm a MapReduce w Hadoop Cluster do przetwarzania danych? Oczywiście, pomijając oczywiste, że Hadoop (przetwarzanie przez MapReduce w klastrze Hadoop) jest systemem przetwarzania wsadowego, a Storm jest systemem przetwarzania w czasie rzeczywistym.

Pracowałem trochę z Hadoop Eco System, ale nie pracowałem z Storm. Po przejrzeniu wielu prezentacji i artykułów nadal nie udało mi się znaleźć satysfakcjonującej i wyczerpującej odpowiedzi. Uwaga: tutaj termin „kompromis” nie ma na celu porównania z podobnymi rzeczami. Ma przedstawiać konsekwencje uzyskiwania wyników w czasie rzeczywistym, których nie ma w systemie przetwarzania wsadowego.

MapReduce: odporna na błędy rozproszona struktura obliczeniowa. MapReduce pozwala na operowanie na ogromnych ilościach danych – z dużym nakładem pracy, aby zapobiec awariom spowodowanym sprzętem. MapReduce to kiepski wybór do obliczania wyników w locie, ponieważ jest wolny. (Typowe zadanie MapReduce zajmuje kilka minut lub godzin, a nie mikrosekund). Zadanie MapReduce pobiera plik (lub jakiś magazyn danych) jako dane wejściowe i zapisuje plik wyników. Jeśli chcesz, aby te wyniki były dostępne dla aplikacji, Twoim obowiązkiem jest umieszczenie tych danych w dostępnym miejscu. Jest to prawdopodobnie powolne i będzie występować opóźnienie między wartościami, które można wyświetlić, a wartościami reprezentującymi system w jego bieżącym stanie. Ważnym rozróżnieniem, które należy rozróżnić, rozważając użycie MapReduce w budowaniu systemów czasu rzeczywistego, jest szkolenie modelu i zastosowanie modelu. Jeśli uważasz, że parametry modelu nie zmieniają się szybko, możesz dopasować je za pomocą MapReduce, a następnie mieć mechanizm dostępu do tych wstępnie dopasowanych parametrów, gdy chcesz zastosować model. Storm: system obliczeniowy do przesyłania strumieniowego w czasie rzeczywistym. Storm to framework online, w tym sensie usługa, która współdziała z uruchomioną aplikacją. W przeciwieństwie do MapReduce, otrzymuje małe fragmenty danych (nie cały plik), gdy są one przetwarzane w aplikacji. Definiujesz DAG operacji do wykonania na danych. Typowym i prostym przypadkiem użycia Storm jest śledzenie liczników i wykorzystywanie tych informacji do wypełniania pulpitu nawigacyjnego w czasie rzeczywistym. Storm nie ma (koniecznie) nic wspólnego z utrwalaniem danych. W tym przypadku przesyłanie strumieniowe to kolejny sposób na zatrzymanie informacji, na których Ci zależy, i wyrzucenie reszty.

W rzeczywistości prawdopodobnie masz w aplikacji warstwę trwałości, która już zarejestrowała dane, a więc jest to dobre i uzasadnione rozdzielenie obaw. Jeśli chcesz wiedzieć więcej… Jeśli chcesz dowiedzieć się więcej o systemach czasu rzeczywistego, które pasują do parametrów z MR i stosują modele w inny sposób, oto slajdy do wykładu, który wygłosiłem na temat tworzenia silników rekomendacji w czasie rzeczywistym na HBase. Doskonałym dokumentem, który w interesujący sposób łączy liczenie w czasie rzeczywistym i wytrwałość, jest Personalizacja Google News: skalowalne, oparte na współpracy filtrowanie online Kolejnym interesującym połączeniem MR i Storm jest SummingBird. Summingbird umożliwia zdefiniowanie operacji analizy danych, które można zastosować za pośrednictwem Storm lub MR.

To trochę tak, jakby pytać o kompromisy między patelnią a szufladą ze sztućcami. Tak naprawdę to nie są dwie rzeczy, które można porównać. Możesz ich używać razem w ramach większego projektu. Sam Hadoop to nie jedno, ale nazwa federacji usług, takich jak HDFS, Hive, HBase, MapReduce itp. Storm to coś, czego używasz w przypadku niektórych z tych usług, takich jak HDFS lub HBase. Jest to struktura przetwarzania strumieniowego. W rozszerzonym ekosystemie Hadoop są inne, takie jak Spark Streaming. Kiedy wybrałbyś platformę przetwarzania strumieniowego? kiedy musisz reagować na nowe dane w czasie zbliżonym do rzeczywistego. Jeśli potrzebujesz tego rodzaju narzędzia, wdrażasz również takie narzędzie.

Kaskadowy błąd w Apache Storm

Przeglądając prezentację i materiały Summingbird na Twitterze, jednym z powodów, o których wspomina się przy jednoczesnym używaniu klastrów Storm i Hadoop w Summingbird, jest to, że przetwarzanie za pośrednictwem Storm powoduje kaskadowanie błędów. Aby uniknąć kaskadowania błędów i ich akumulacji, klaster Hadoop jest używany do przetwarzania wsadowego danych i odrzucania wyników Storm po przetworzeniu tych samych danych przez Hadoop. Jakie są przyczyny generowania tej kumulacji błędów? i dlaczego nie ma go w Hadoop? Ponieważ nie pracowałem ze Stormem, nie znam powodów. Czy to dlatego, że Storm używa przybliżonego algorytmu do przetwarzania danych w celu przetwarzania ich w czasie rzeczywistym? czy może przyczyna jest inna?

Twitter używa Storm do przetwarzania danych w czasie rzeczywistym. Mogą wystąpić problemy z danymi w czasie rzeczywistym. Systemy mogą ulec awarii. Dane mogą zostać nieumyślnie przetworzone dwukrotnie. Połączenia sieciowe mogą zostać utracone. W systemie czasu rzeczywistego może się wiele wydarzyć. Używają hadoopa do niezawodnego przetwarzania danych historycznych. Nie znam szczegółów, ale na przykład uzyskanie solidnych informacji z zagregowanych dzienników jest prawdopodobnie bardziej niezawodne niż dołączenie do strumienia. Gdyby po prostu polegali na Storm we wszystkim – Storm miałby problemy ze względu na charakter dostarczania informacji w czasie rzeczywistym na dużą skalę. Jeśli we wszystkim polegali na hadoopie, wiąże się to z dużym opóźnieniem. Połączenie tych dwóch z Summingbird to kolejny logiczny krok.

Czy muszę się uczyć Hadoop, aby zostać naukowcem danych?

Aspirujący naukowiec danych. Nie wiem nic o Hadoopie, ale czytając o Data Science i Big Data, wiele mówi się o Hadoop. Czy jest absolutnie konieczne, aby nauczyć się Hadoop, aby zostać naukowcem danych?

Różni ludzie używają różnych narzędzi do różnych celów. Terminy takie jak nauka o danych są ogólne z jakiegoś powodu. Analityk danych może spędzić całą karierę bez konieczności uczenia się konkretnego narzędzia, takiego jak hadoop. Hadoop jest szeroko stosowany, ale nie jest jedyną platformą, która jest w stanie zarządzać danymi, nawet tymi na dużą skalę, i nimi manipulować. Powiedziałbym, że naukowiec zajmujący się danymi powinien znać pojęcia takie jak MapReduce, systemy rozproszone, rozproszone systemy plików i tym podobne, ale nie oceniałbym kogoś za brak wiedzy o takich rzeczach.

To duże pole. Jest morze wiedzy i większość ludzi jest w stanie nauczyć się i być ekspertem w jednej kropli. Kluczem do bycia naukowcem jest chęć uczenia się i motywacja do poznania tego, czego jeszcze nie wiesz. Na przykład: mógłbym przekazać właściwej osobie sto ustrukturyzowanych plików CSV zawierających informacje o wynikach w jednej klasie w ciągu dziesięciu lat. Naukowiec zajmujący się danymi mógłby spędzić rok na zbieraniu informacji z danych bez konieczności rozłożenia obliczeń na wiele maszyn. Można zastosować algorytmy uczenia maszynowego, analizować je za pomocą wizualizacji, łączyć z zewnętrznymi danymi o regionie, składzie etnicznym, zmianach środowiska w czasie, informacjami politycznymi, wzorcami pogodowymi itp. Wszystko to byłoby według mnie „nauką o danych”. . Potrzeba czegoś w rodzaju hadoopa, aby przetestować i zastosować wszystko, czego się nauczyłeś, do danych obejmujących cały kraj uczniów, a nie tylko salę lekcyjną, ale ten ostatni krok niekoniecznie czyni kogoś badaczem danych. A niepodjęcie tego ostatniego kroku niekoniecznie dyskwalifikuje kogoś z bycia naukowcem danych.

Jako były inżynier Hadoop nie jest to potrzebne, ale pomaga. Hadoop to tylko jeden system – najpopularniejszy system oparty na Javie i ekosystem produktów, które stosują określoną technikę „Mapuj / Zmniejsz”, aby uzyskać wyniki w odpowiednim czasie. Hadoop nie jest używane w Google, chociaż zapewniam, że używają analityki dużych zbiorów danych. Google korzysta z własnych systemów, opracowanych w C ++. W rzeczywistości Hadoop powstał w wyniku opublikowania przez Google ich białych ksiąg Map / Reduce i BigTable (HBase in Hadoop). Naukowcy zajmujący się danymi będą współpracować z inżynierami hadoopów, chociaż w mniejszych miejscach może być  wymagane noszenie obu czapek. Jeśli jesteś ściśle analitykiem danych, to wszystko, czego używasz do analizy, R, Excel, Tableau itp., Będzie działać tylko na niewielkim podzbiorze, a następnie będzie musiało zostać przekonwertowane, aby działało z pełnym zestawem danych obejmującym hadoop.

Najpierw musisz wyjaśnić, co masz na myśli, mówiąc „naucz się Hadoop”. Jeśli masz na myśli używanie Hadoop, na przykład naukę programowania w MapReduce, to najprawdopodobniej jest to dobry pomysł. Jednak wiedza podstawowa (baza danych, uczenie maszynowe, statystyka) może odgrywać większą rolę w miarę upływu czasu.

Filtrowanie spamu z pobranych danych

Słyszałem kiedyś, że filtrowanie spamu za pomocą czarnych list nie jest dobrym podejściem, ponieważ niektórzy użytkownicy szukający wpisów w Twoim zbiorze danych mogą szukać określonych informacji z zablokowanych źródeł. Ponadto ciągłe sprawdzanie aktualnego stanu każdego zablokowanego spamera, sprawdzanie, czy witryna / domena nadal rozpowszechnia dane o spamie, stałoby się ciężarem. Biorąc pod uwagę, że każde podejście musi być wydajne i skalowalne, aby obsługiwać filtrowanie na bardzo dużych zbiorach danych, jakie są dostępne strategie pozbycia się spamu w sposób nieobiektywny?

Edycja: jeśli to możliwe, każdy przykład strategii, nawet jeśli tylko intuicja za nim stoi, byłby bardzo mile widziany wraz z odpowiedzią.

Sieci neuronowe zrewolucjonizowały filtrowanie spamu, zwłaszcza w wiadomościach e-mail.

EDYCJA: Podstawową intuicją stojącą za używaniem sieci neuronowej do pomocy w filtrowaniu spamu jest przypisywanie wagi terminom na podstawie tego, jak często są one powiązane ze spamem. Najszybciej sieci neuronowe można trenować w nadzorowanym – jawnie podajesz klasyfikację zdania w zbiorze uczącym – środowisko. Bez wchodzenia do nitty gritty podstawową ideę można zilustrować tymi zdaniami:

Tekst = „Jak utrata patentu Viagry wpłynie na firmę Pfizer”, Spam = false Text = „Tania Viagra Kup teraz”, Spam = true Text = „Apteka internetowa Viagra Cialis Lipitor”, Spam = true

W przypadku dwuetapowej sieci neuronowej pierwszy etap obliczy prawdopodobieństwo spamu na podstawie tego, czy słowo istnieje w zdaniu. A więc z naszego przykładu: viagra => 66% kup => 100% Pfizer => 0% itd. Następnie w drugim etapie wyniki z pierwszego etapu są używane jako zmienne w drugim etapie: viagra & buy => 100% Pfizer & viagra => 0%. Ta podstawowa idea jest stosowana dla wielu permutacji wszystkich słów w danych treningowych. Po wytrenowaniu wyników końcowych chodzi w zasadzie tylko o równanie, które na podstawie kontekstu słów w zdaniu może określić prawdopodobieństwo spamu. Ustaw próg spamowania i odfiltruj wszelkie dane powyżej wspomnianego progu.

Czy FPGrowth nadal często jest uważane za „najnowocześniejsze” górnictwo?

Z tego, co wiem o rozwoju algorytmów do rozwiązania problemu FPM (Frequent Pattern Mining), droga ulepszeń ma kilka głównych punktów kontrolnych. Po pierwsze, algorytm Apriori został zaproponowany w 1993 roku przez Agrawala i wspólnikóe. , wraz z formalizacją problemu. Algorytm był w stanie usunąć niektóre zestawy z zestawów 2 ^ n – 1 (poweret) przy użyciu kraty do utrzymania danych. Wadą tego podejścia była konieczność ponownego odczytu bazy danych w celu obliczenia częstotliwości każdego rozszerzanego zestawu. Później, w 1997 roku, Zaki i wspólnicy. Zaproponował algorytm Eclat, który wstawiał wynikową częstotliwość każdego zestawu do wnętrza sieci. Dokonano tego poprzez dodanie, w każdym węźle sieci, zestawu identyfikatorów transakcji, które zawierały elementy od korzenia do węzła, do którego się odnosi. Główny wkład polega na tym, że nie trzeba ponownie czytać całego zbioru danych, aby poznać częstotliwość każdego zestawu, ale pamięć wymagana do utrzymania takiej struktury danych może przekroczyć rozmiar samego zbioru danych. W 2000 roku Han i wsp. zaproponowali algorytm o nazwie FPGrowth wraz z przedrostkową strukturą danych w postaci drzewa o nazwie FPTree. Algorytm był w stanie zapewnić znaczną kompresję danych, jednocześnie zapewniając, że zostaną uzyskane tylko częste zestawy elementów (bez generowania zestawu elementów kandydatów). Odbyło się to głównie poprzez sortowanie pozycji każdej transakcji w kolejności malejącej, tak aby pozycje najczęściej występowały w przypadku najmniej powtórzeń w strukturze danych drzewa. Ponieważ częstotliwość spada tylko podczas dogłębnego przemierzania drzewa, algorytm jest w stanie usunąć rzadkie zestawy elementów. Czy algorytm FPGrowth jest nadal uważany za „najnowocześniejszy” w częstym eksploracji wzorców? Jeśli nie, jakie algorytmy mogą skuteczniej wyodrębniać częste zestawy pozycji z dużych zbiorów danych?

Stan techniki: zastosowany w praktyce czy opracowany w teorii?

APRIORI jest używane wszędzie, z wyjątkiem opracowywania nowych algorytmów częstego zestawiania przedmiotów. Jest łatwy do wdrożenia i ponownego wykorzystania w bardzo różnych dziedzinach. Znajdziesz setki wdrożeń APRIORI o różnej jakości. W rzeczywistości łatwo jest pomylić APRIORI.

FPgrowth jest znacznie trudniejszy do zaimplementowania, ale także znacznie bardziej interesujący. Z akademickiego punktu widzenia każdy stara się poprawić wzrost FP – uzyskanie pracy w oparciu o zaakceptowane APRIORI będzie teraz bardzo trudne. Jeśli masz dobrą implementację, każdy algorytm jest dobry i moim zdaniem są to złe sytuacje. Dobra implementacja APRIORI będzie wymagała jedynie przeszukania bazy danych k razy, aby znaleźć wszystkie częste zestawy elementów o długości k. W szczególności, jeśli dane mieszczą się w pamięci głównej, jest to tanie. To, co może zabić APRIORI, to zbyt wiele częstych zestawów 2 elementów (zwłaszcza gdy nie używasz Trie i podobnych technik przyspieszania itp.). Działa najlepiej w przypadku dużych danych z małą liczbą częstych zestawów elementów. Eclat działa na kolumnach; ale musi czytać każdą kolumnę znacznie częściej. Trwają prace nad mechanizmami różnicowymi, aby zmniejszyć tę pracę. Jeśli twoje dane nie mieszczą się w pamięci głównej, Eclat cierpi prawdopodobnie bardziej niż Apriori. Przechodząc najpierw w głąb, będzie w stanie zwrócić pierwszy interesujący wynik znacznie wcześniej niż Apriori i możesz użyć tych wyników do dostosowania parametrów; więc potrzebujesz mniej iteracji, aby znaleźć dobre parametry. Ale z założenia nie może wykorzystywać przycinania tak starannie, jak zrobił to Apriori. FPGrowth kompresuje zestaw danych do drzewa. Działa to najlepiej, gdy masz dużo zduplikowanych rekordów. Prawdopodobnie możesz odnieść spore korzyści także dla Apriori i Eclat, jeśli możesz wstępnie posortować swoje dane i scalić duplikaty w ważone wektory. FPGrowth robi to na ekstremalnym poziomie. Wadą jest to, że implementacja jest znacznie trudniejsza; a kiedy to drzewo nie mieści się już w pamięci, robi się bałagan do zaimplementowania. Jeśli chodzi o wyniki wydajności i testy porównawcze – nie ufaj im. Jest tak wiele rzeczy do nieprawidłowego wdrożenia. Wypróbuj 10 różnych implementacji, a uzyskasz 10 bardzo różnych wyników wydajności. W szczególności w przypadku APRIORI mam wrażenie, że większość implementacji jest zepsuta w tym sensie, że brakuje niektórych głównych elementów APRIORI… a wśród tych, które mają te części prawidłowo, jakość optymalizacji jest bardzo różna.

Większość ostatnich podejść do częstych wzorców, które widziałem w literaturze, opiera się na optymalizacji FPGrowth. Muszę przyznać, że od wielu lat nie widziałem wielu zmian w literaturze dotyczącej FPM.

Czy Python jest odpowiedni dla dużych zbiorów danych?

W tym poście przeczytałem, że język R jest odpowiedni dla Big Data, że ​​duże zbiory danych stanowią 5 TB i chociaż dobrze radzą sobie z dostarczaniem informacji o możliwości pracy z tego typu danymi w R, to dostarczają bardzo mało informacji o Pythonie. Zastanawiałem się, czy Python może również pracować z taką ilością danych. Aby wyjaśnić, czuję, że oryginalne odniesienia do pytań przez OP prawdopodobnie nie są najlepsze dla formatu typu SO, ale z pewnością będę reprezentował Pythona w tym konkretnym przypadku. Zacznę od tego, że niezależnie od rozmiaru danych, Python nie powinien być czynnikiem ograniczającym. W rzeczywistości jest tylko kilka głównych problemów, które napotkasz w przypadku dużych zbiorów danych:

* Wczytywanie danych do pamięci – jest to zdecydowanie najczęstszy problem w świecie dużych zbiorów danych. Zasadniczo nie możesz wczytać więcej danych, niż masz w pamięci (RAM). Najlepszym sposobem rozwiązania tego problemu jest wykonanie niepodzielnych operacji na danych zamiast próby wczytania wszystkiego naraz.

* Przechowywanie danych – w rzeczywistości jest to tylko kolejna forma wcześniejszego wydania, zanim osiągniesz około 1 TB, zaczniesz szukać gdzie indziej miejsca do przechowywania. AWS S3 jest najpopularniejszym zasobem, a python ma fantastyczną bibliotekę boto, która ułatwia prowadzenie z dużymi fragmentami danych.

* Opóźnienie sieci – Twoim wąskim gardłem będzie przenoszenie danych między różnymi usługami. Nie możesz zrobić wiele, aby to naprawić, poza próbą wybrania zasobów w kolokacji i podłączeniem do ściany.

Jest kilka rzeczy, które musisz zrozumieć, mając do czynienia z Big Data –

Co to jest Big Data?

Być może znasz słynne V Big Data – Volume, Velocity, Variety… Więc Python może nie być odpowiedni dla wszystkich. I to pasuje do wszystkich dostępnych narzędzi do analizy danych. Musisz wiedzieć, które narzędzie jest dobre do jakiego celu. W przypadku dużej ilości danych:

Pig / Hive / Shark – czyszczenie danych i prace ETL

Hadoop / Spark – rozproszone przetwarzanie równoległe

Mahout / ML-Lib – uczenie maszynowe

Teraz możesz używać R / Python na etapach pośrednich, ale zdasz sobie sprawę, że stają się wąskim gardłem w całym procesie. Jeśli masz do czynienia z prędkością danych:

Kafka / Storm – system o dużej przepustowości

Ludzie próbują tutaj R / Python, ale znowu zależy to od rodzaju paralelizmu, który chcesz i złożoności modelu. Jeśli model wymaga, aby najpierw wszystkie dane zostały przeniesione do pamięci, model nie powinien być złożony, ponieważ jeśli dane pośrednie są duże, kod ulegnie awarii. A jeśli myślisz o zapisaniu go na dysku, napotkasz dodatkowe opóźnienie, ponieważ odczyt / zapis dysku jest wolny w porównaniu z pamięcią RAM.

Wniosek

Zdecydowanie możesz używać Pythona w przestrzeni Big Data (zdecydowanie, ponieważ ludzie próbują z R, dlaczego nie Python), ale najpierw poznaj swoje dane i wymagania biznesowe. Mogą być dostępne lepsze narzędzia do tego samego i zawsze pamiętaj: Twoje narzędzia nie powinny określać, jak odpowiadasz na pytania. Twoje pytania powinny określić, jakich narzędzi używasz.

Python ma kilka bardzo dobrych narzędzi do pracy z dużymi zbiorami danych:

numpy

Tablice mapowane w pamięci Numpy umożliwiają dostęp do pliku zapisanego na dysku tak, jakby był to tablica. Tylko części tablicy, z którymi aktywnie pracujesz, muszą zostać załadowane do pamięci. Można go używać prawie tak samo, jak zwykłej tablicy.

h5py i pytables

Te dwie biblioteki zapewniają dostęp do plików HDF5. Pliki te umożliwiają dostęp tylko do części danych. Ponadto, dzięki bazowym bibliotekom używanym do uzyskiwania dostępu do danych, wiele operacji matematycznych i innych manipulacji danymi można wykonać bez ładowania ich do struktury danych Pythona. Możliwe są ogromne pliki o wysokiej strukturze, znacznie większe niż 5 TB. Umożliwia również płynną, bezstratną kompresję.

bazy danych

Istnieją różne typy baz danych, które umożliwiają przechowywanie dużych zbiorów danych i ładowanie tylko potrzebnych części. Wiele baz danych umożliwia wykonywanie manipulacji bez ładowania danych do struktury danych Pythona.

pandas

Umożliwia to wyższy poziom dostępu do różnych typów danych, w tym danych HDF5, plików csv, baz danych, a nawet stron internetowych. W przypadku dużych zbiorów danych zapewnia otoki wokół dostępu do plików HDF5, które ułatwiają analizę zbiorów dużych zbiorów danych.

mpi4py

Jest to narzędzie do uruchamiania kodu Pythona w sposób rozproszony na wielu procesorach lub nawet na wielu komputerach. Pozwala to na jednoczesną pracę nad częściami danych.

dask

Dostarcza wersję normalnej tablicy numpy, która obsługuje wiele normalnych operacji numpy w sposób wielordzeniowy, który może pracować na danych zbyt dużych, aby zmieściły się w pamięci.

blaze

Narzędzie zaprojektowane specjalnie dla dużych zbiorów danych. Jest to w zasadzie opakowanie wokół powyższych bibliotek, zapewniające spójne interfejsy dla różnych metod przechowywania dużych ilości danych (takich jak HDF5 lub bazy danych) oraz narzędzia ułatwiające manipulowanie, wykonywanie operacji matematycznych i analizowanie danych, które jest zbyt duży, aby zmieścić się w pamięci.

[42][Data Mining]

Mówiąc koncepcyjnie, eksplorację danych można traktować jako jeden element (lub zestaw umiejętności i zastosowań) w zestawie narzędzi naukowca zajmującego się danymi. Mówiąc dokładniej, eksploracja danych to czynność polegająca na poszukiwaniu wzorców w dużych, złożonych zestawach danych. Zwykle kładzie nacisk na techniki algorytmiczne, ale może również obejmować dowolny zestaw powiązanych umiejętności, aplikacji lub metodologii służących temu celowi. W mowie potocznej w języku amerykańsko-angielskim eksploracja danych i gromadzenie danych są często używane zamiennie. Jednak główną różnicą między tymi dwoma powiązanymi działaniami jest celowość.

PYTANIA:

Grupowanie K-średnich dla mieszanych danych liczbowych i jakościowych

Mój zestaw danych zawiera szereg atrybutów liczbowych i jeden kategoryczny. Powiedz, NumericAttr1, NumericAttr2, …, NumericAttrN, CategoricalAttr, gdzie CategoricalAttr przyjmuje jedną z trzech możliwych wartości: CategoricalAttrValue1, CategoricalAttrValue2 lub CategoricalAttrValue3. Używam domyślnej implementacji algorytmu klastrowania k-średnich dla Octave https://blog.west.uni-koblenz.de/2012-07-14/a-working-k-means-code-for-octave/. Działa tylko z danymi liczbowymi. Więc moje pytanie: czy podzielenie atrybutu kategorialnego CategoricalAttr na trzy zmienne numeryczne (binarne), takie jak IsCategoricalAttrValue1, IsCategoricalAttrValue2, IsCategoricalAttrValue3, jest poprawne?

Standardowy algorytm k-średnich nie ma bezpośredniego zastosowania do danych kategorialnych z różnych powodów. Przestrzeń próbna dla danych kategorycznych jest dyskretna i nie ma naturalnego pochodzenia. Funkcja odległości euklidesowej w takiej przestrzeni nie ma większego znaczenia. Jak ktoś to ujął: „Fakt, że wąż nie ma ani kół, ani nóg, nie pozwala nam nic powiedzieć o względnej wartości kół i nóg”. (stąd) Istnieje odmiana k-średnich znanych jako k-modów, wprowadzona w tym artykule przez Zhexue Huang, która jest odpowiednia dla danych jakościowych. Zwróć uwagę, że otrzymane rozwiązania są wrażliwe na warunki początkowe, jak omówiono na przykład tutaj (PDF). Praca Huanga (do której link znajduje się powyżej) zawiera również sekcję o „k-protoypes”, która dotyczy danych z połączeniem cech jakościowych i liczbowych. Używa miary odległości, która łączy odległość Hamminga dla cech kategorialnych i odległość euklidesową dla cech numerycznych. Wyszukiwanie w Google „mieszanki k-średnich danych kategorialnych” prowadzi do pojawienia się kilku nowszych artykułów na temat różnych algorytmów grupowania k-średnich z mieszanką danych jakościowych i liczbowych. (Jeszcze ich nie czytałem, więc nie mogę komentować ich zalet). Właściwie to, co sugerujesz (konwersja atrybutów kategorialnych na wartości binarne, a następnie wykonywanie k-średnich tak, jakby były to wartości liczbowe) jest innym podejściem, które został wypróbowany wcześniej (przed trybami k). Ale uważam, że podejście kmodes jest preferowane z powodów, które wskazałem powyżej.

Moim zdaniem istnieją rozwiązania umożliwiające radzenie sobie z danymi kategorycznymi w grupowanie. R ma określoną odległość dla danych kategorycznych. Odległość ta nazywa się Gower (http: //www.insider. Org / packages / cran / StatMatch / docs / gower.dist) i działa całkiem dobrze.

Grupowanie danych klientów przechowywanych w ElasticSearch

Mam kilka profili klientów przechowywanych w klastrze Flexiblesearch. Te profile są teraz używane do tworzenia grup docelowych dla naszych subskrypcji e-mailowych. Grupy docelowe są teraz tworzone ręcznie za pomocą funkcji wyszukiwania aspektowego elastycznego wyszukiwania (np. Pozyskiwanie wszystkich klientów płci męskiej w wieku 23 lat z jednym samochodem i trojgiem dzieci). Jak mogę automatycznie wyszukiwać interesujące grupy – przy użyciu nauki o danych, maszynowe uczenie, tworzenie klastrów czy coś innego? R język programowania wydaje się być dobrym narzędziem do tego zadania, ale nie potrafię sformułować metodologii takiego wyszukiwania grupowego. Jednym z rozwiązań jest jakoś wyszukanie największych klastrów klientów i wykorzystanie ich jako grup docelowych, więc pytanie brzmi: jak mogę automatycznie wybrać największe skupiska podobnych klientów (podobnych przez parametry, których w tej chwili nie znam)?

Na przykład: mój program połączy się z elastyczną wyszukiwarką, przeładuje dane klientów do CSV i używając skryptu języka R wykryje, że duża część klientów to mężczyźni bez dzieci, a kolejna duża część klientów ma samochód i ma brązowe oczy.

Jednym z algorytmów, który może być użyty do tego jest algorytm grupowania k-średnich. Gruntownie:

  1. Losowo wybierz k punktów danych ze swojego zestawu, m_1,…, m_k.
  2. „Do konwergencji”:
  3. Przypisz punkty danych do k klastrów, gdzie klaster i to zbiór punktów, dla których m_i jest najbliższą z twoich aktualnych średnich
  4. Zastąp każde m_i średnią wszystkich punktów przypisanych do klastra i.

Dobrą praktyką jest kilkakrotne powtórzenie tego algorytmu, a następnie wybranie wyniku, który minimalizuje odległości między punktami każdego klastra i a środkiem m_i. Oczywiście musisz znać k, aby zacząć tutaj; możesz jednak użyć weryfikacji krzyżowej, aby wybrać ten parametr.

Jakie są dobre źródła, aby dowiedzieć się o Bootstrap?

Myślę, że Bootstrap może być przydatny w mojej pracy, w której mamy wiele zmiennych, których nie znamy w dystrybucji. Zatem symulacje mogą pomóc. Jakie są dobre źródła, aby dowiedzieć się o Bootstrap / innych przydatnych metodach symulacji?

Czy maszyny obsługujące wektorów są nadal uważane za „najnowocześniejsze” w swojej niszy?

To pytanie jest odpowiedzią na komentarz, który widziałem na temat innego pytania.

Komentarz dotyczył programu nauczania uczenia maszynowego na Coursera i stwierdzał, że „maszyny SVM nie są obecnie tak często używane”. Właśnie skończyłem osobiście odpowiednie wykłady i rozumiem, że maszyny SVM są solidnym i wydajnym algorytmem uczenia się do klasyfikacji, a gdy używam jądra, mają one „niszę” obejmującą wiele funkcji, być może od 10 do 1000 i liczba próbek szkoleniowych może wynosić od 100 do 10 000. Ograniczenie dotyczące próbek uczących wynika z tego, że podstawowy algorytm obraca się wokół optymalizacji wyników generowanych z macierzy kwadratowej o wymiarach opartych na liczbie próbek uczących, a nie liczbie oryginalnych cech.

Czy komentarz, który widziałem, odnosi się do jakiejś prawdziwej zmiany od czasu wprowadzenia kursu, a jeśli tak, jaka to zmiana: nowy algorytm, który obejmuje również „sweet spot” SVM, lepsze procesory, co oznacza, że ​​zalety obliczeniowe SVM nie są tak dużo warte ? A może taka jest opinia lub osobiste doświadczenie komentującego? Próbowałem wyszukać np. „Są z mody maszynami wektorów nośnych” i nie stwierdzili, że nic nie sugeruje, że zostały porzucone na rzecz czegokolwiek innego.

A Wikipedia ma to: http://en.wikipedia.org/wiki/Support_vector_machine#Issues

… Głównym punktem spornym wydaje się być trudność w interpretacji modelu. Co sprawia, że ​​SVM jest odpowiedni dla silnika przewidującego czarną skrzynkę, ale nie jest tak dobry do generowania spostrzeżeń. Nie uważam tego za poważny problem, tylko kolejną drobną rzecz, którą należy wziąć pod uwagę przy wyborze odpowiedniego narzędzia do pracy (wraz z charakterem danych szkoleniowych i zadaniem edukacyjnym itp.).

SVM to potężny klasyfikator. Ma kilka fajnych zalet (które, jak sądzę, przyczyniły się do jego popularności)… Są to:

Wydajność: Tylko wektory pomocnicze odgrywają rolę w określaniu granicy klasyfikacji. Wszystkie inne punkty z zestawu treningowego nie muszą być przechowywane w pamięci. Tak zwana moc jądra: dzięki odpowiednim jądrom można przekształcić przestrzeń cech w wyższy wymiar, tak aby stała się liniowo rozdziela. Pojęcie jądra działa z dowolnymi obiektami, na których można zdefiniować pewne pojęcie podobieństwa za pomocą iloczynów wewnętrznych… a zatem maszyny SVM mogą klasyfikować dowolne obiekty, takie jak drzewa, wykresy itp. Istnieją również pewne istotne wady. Czułość parametrów: wydajność jest bardzo wrażliwa na wybór parametru regularyzacji C, co pozwala na pewną wariancję w modelu. Dodatkowy parametr dla jądra Gaussa: promień jądra Gaussa może mieć znaczący wpływ na dokładność klasyfikatora. Zazwyczaj w celu znalezienia optymalnych parametrów należy przeprowadzić przeszukiwanie sieci. LibSVM obsługuje wyszukiwanie w siatce. Maszyny SVM generalnie należą do klasy „rzadkich maszyn jądra”. Rzadkie wektory w przypadku SVM są wektorami pomocniczymi, które są wybierane z kryterium maksymalnego marginesu. Inne rzadkie maszyny wektorowe, takie jak maszyna wektorów istotności (RVM), działają lepiej niż SVM. Poniższy rysunek przedstawia porównawczą wydajność obu. Na rysunku oś x przedstawia jednowymiarowe dane z dwóch klas y = {0,1}. Model mieszaniny jest zdefiniowany jako P (x | y = 0) = Unif (0,1) i P (x | y = 1) = Unif (.5,1,5) (Unif oznacza rozkład równomierny). Z tej mieszaniny pobrano próbki 1000 punktów i zastosowano SVM i RVM do oszacowania późniejszego. Problem SVM polega na tym, że przewidywane wartości są dalekie od prawdziwych log kursów.

Bardzo skutecznym klasyfikatorem, który jest obecnie bardzo popularny, jest Losowy Las. Główne zalety to:

* Tylko jeden parametr do dostrojenia (tj. Liczba drzew w lesie)

* Brak całkowitej wrażliwości na parametry

* Można łatwo rozszerzyć na wiele klas

* Opiera się na zasadach probabilistycznych (maksymalizacja wzajemnego uzyskiwania informacji za pomocą drzew decyzyjnych)

Dane handlowe NASDAQ

Próbuję znaleźć dane giełdowe do ćwiczenia, czy jest na to dobry zasób? Znalazłem to: ftp://emi.nasdaq.com/ITCH/, ale ma tylko bieżący rok. Mam już sposób parsowania protokołu, ale chciałbym mieć więcej danych do porównania. Nie musi być w tym samym formacie, o ile zawiera statystyki dotyczące cen, transakcji i dat.

Możesz bardzo łatwo pobrać dane giełdowe w Pythonie i R (prawdopodobnie również w innych językach) za pomocą następujących pakietów: W pythonie za pomocą: https://pypi.python.org/pypi/ystockquote To także bardzo fajny samouczek w iPythonie, który pokazuje, jak pobrać dane giełdowe i bawić się nimi: http://nbviewer.ipython.org/github/twiecki/financial-analysis-pythontutorial/ blob / master / 1.% 20Pandas% 20Basics.ipynb

W R z: http://www.quantmod.com/HTH.

 Jaki jest pożytek z gromadzenia danych użytkowników oprócz wyświetlania reklam?

Cóż, to wygląda na najbardziej odpowiednie miejsce na to pytanie. Każda witryna internetowa gromadzi dane użytkownika, niektóre tylko ze względu na użyteczność i personalizację, ale większość, podobnie jak sieci społecznościowe, śledzi każdy ruch w sieci, niektóre bezpłatne aplikacje na telefonie skanują wiadomości tekstowe, historię połączeń i tak dalej. Całe to pobieranie danych służy tylko do sprzedaży Twojego profilu reklamodawcom?

Kilka dni temu programiści z jednej firmy produktowej zapytali mnie, jak mogą zrozumieć, dlaczego nowi użytkownicy opuszczają ich witrynę. Moje pierwsze pytanie dotyczyło tego, jak wyglądały profile tych użytkowników i czym się różniły od tych, którzy zostali. Reklama to tylko szczyt góry lodowej. Profile użytkowników (wypełniane przez samych użytkowników lub obliczane na podstawie zachowania użytkowników) zawierają informacje o: kategoriach użytkowników, tj. Jakiego rodzaju ludzie mają tendencję do korzystania z portrety klientów w Twojej witrynie / produkcie, tj. Kto jest bardziej skłonny do korzystania z komponentu UX usług płatnych wydajność, np ile czasu zajmuje ludziom znalezienie przycisku, którego potrzebują, porównanie skuteczności działania, np. co było bardziej wydajne – niższa cena na weekend lub proponowanie prezentów przy każdym zakupie itp. Chodzi więc bardziej o ulepszenie produktu i poprawę wrażeń użytkownika, niż o sprzedawanie tych danych reklamodawcom.

Większość firm nie będzie sprzedawać danych, w każdym razie nie na małą skalę. Większość użyje go wewnętrznie. Dane śledzenia użytkowników są ważne dla zrozumienia wielu rzeczy. Istnieją podstawowe testy A / B, w których zapewniasz różne doświadczenia, aby zobaczyć, który jest bardziej skuteczny. Jest

zrozumienie, w jaki sposób używany jest interfejs użytkownika. Kategoryzowanie użytkowników końcowych na różne sposoby z różnych powodów. Dowiedzieć się, gdzie znajduje się Twoja baza użytkowników końcowych oraz w ramach tej grupy, gdzie znajdują się ważni użytkownicy końcowi. Korelowanie doświadczeń użytkowników z aktualizacjami sieci społecznościowych.

Dowiedz się, co przyciągnie ludzi do Twojego produktu i co ich odstrasza. Lista potencjalnych projektów eksploracji i analizy danych może trwać kilka dni. Przechowywanie danych jest tanie. Jeśli śledzisz wszystko poza bramą, możesz później dowiedzieć się, co chcesz zrobić z tymi danymi. Skanowanie wiadomości tekstowych jest szkicowym obszarem, gdy nie ma ku temu dobrego powodu. Nawet jeśli istnieje dobry powód, jest to szkicowy obszar. Chciałbym powiedzieć, że nikt tego nie robi, ale zdarzały się sytuacje, w których robiły to duże firmy i jest wiele przypadków, w których aplikacje bez nazwy przynajmniej wymagają dostępu do tego rodzaju danych do instalacji. Jako konsument generalnie marszczę brwi na tego typu rzeczy, ale analityk danych we mnie chciałby zobaczyć, czy mogę zbudować cokolwiek pożytecznego z takiego zestawu informacji.

Oto praktyczny przykład wykorzystania danych internetowych do celów innych niż reklama. Distil Networks (zastrzeżenie, tam pracuję) wykorzystuje ruch sieciowy do określania, czy dostęp do stron pochodzi od ludzi, czy przez boty – skrobaki, fałszywe kliknięcia, spam itp. Innym przykładem jest część pracy wykonywanej przez Webtrends. Pozwalają użytkownikom witryny zbudować model dla każdego odwiedzającego, aby przewidzieć, czy odejdzie, kupi, doda do koszyka itp. Następnie na podstawie prawdopodobieństwa każdego działania możesz zmienić doświadczenie użytkownika (np. Jeśli zamierzają odejść , daj im kupon).

Dlaczego kilka typów modeli może dawać prawie identyczne wyniki?

Analizowałem zbiór danych zawierający ~ 400 tys. Rekordów i 9 zmiennych. Zmienna zależna jest binarna. Dopasowałem regresję logistyczną, drzewo regresji, losowy las i drzewo wzmocnione gradientem. Wszystkie z nich dają wirtualnie identyczną wartość dopasowania liczb, kiedy sprawdzam poprawność

je na innym zestawie danych. Dlaczego tak jest? Zgaduję, że to dlatego, że stosunek moich obserwacji do zmiennych jest tak wysoki. Jeśli to prawda, przy jakim stosunku obserwacji do zmiennej zaczną dawać różne modele, różne wyniki?

Oznacza to, że niezależnie od zastosowanej metody, jesteś w stanie zbliżyć się do optymalnej reguły decyzyjnej (czyli reguły Bayesa). Podstawowe przyczyny zostały wyjaśnione w „Elements of Statistical Learning” Hastiego, Tibshirani i Friedmana. Nie sądzę, aby wyjaśnieniem było stosunek obserwacji do zmiennej. W świetle mojego uzasadnienia przedstawionego powyżej, jest to stosunkowo prosta forma granicy oddzielającej twoje klasy w wielowymiarowej przestrzeni, którą wszystkie metody, które wypróbowałeś, były w stanie zidentyfikować.

Warto też przyjrzeć się błędom treningowym. w zasadzie nie zgadzam się z twoją analizą. jeśli regresja logistyczna itp. daje te same wyniki, sugerowałoby to, że „najlepszy model” jest bardzo prosty (że wszystkie modele mogą być równie dobrze dopasowane – np. zasadniczo liniowe). Zatem pytanie może brzmieć, dlaczego najlepszy model jest prostym modelem?: Może to sugerować, że twoje zmienne nie są zbyt predykcyjne. Oczywiście trudno jest analizować bez znajomości danych.

K-oznacza: Jakie są dobre sposoby wyboru wydajnego zestawu początkowych centroid?

Gdy używana jest losowa inicjalizacja centroidów, różne przebiegi K-średnich wytwarzają różne całkowite SSE. I ma to kluczowe znaczenie dla działania algorytmu. Jakie są skuteczne podejścia do rozwiązania tego problemu? Doceniane są najnowsze podejścia.

Podejście, które daje bardziej spójne wyniki, to K-średnie ++. Podejście to potwierdza, że ​​istnieje prawdopodobnie lepszy wybór początkowych lokalizacji centroid niż zwykłe losowe przypisanie. W szczególności K-środki mają tendencję do lepszych wyników, gdy centroidy są wysiewane w taki sposób, że nie zlepiają ich razem w przestrzeni.

Krótko mówiąc, metoda jest następująca:

  1. Wybierz losowo jeden ze swoich punktów danych jako początkowy centroid.
  2. Oblicz D(x), odległość między twoim początkowym centroidem a wszystkimi innymi punktami danych, x.
  3. Wybierz następny centroid z pozostałych punktów danych z prawdopodobieństwem proporcjonalnym do D(x)2
  4. Powtarzaj, aż wszystkie centroidy zostaną przypisane.

Uwaga: D(x) należy aktualizować w miarę dodawania większej liczby centroid. Powinna to być odległość między punktem danych a najbliższą centroidą.

Możesz być również zainteresowany przeczytaniem tego artykułu, w którym zaproponowano metodę i opisano jej ogólne oczekiwane działanie.

Mogę źle zrozumieć twoje pytanie, ale zwykle k-średnie wybiera dla ciebie twoje centroidy losowo w zależności od liczby ustawionych klastrów (tj. K). Wybór liczby dla k wydaje się być ćwiczeniem subiektywnym.

Typowe podejście do tego problemu polega na kilkukrotnym ponownym uruchomieniu algorytmu K-średnich, z różnymi losowymi inicjalizacjami centroidów i pozostawieniu najlepszego rozwiązania. Możesz to zrobić, oceniając wyniki na swoich danych szkoleniowych lub za pomocą weryfikacji krzyżowej. Istnieje wiele innych sposobów inicjalizacji centroidów, ale żaden z nich nie będzie działał najlepiej dla każdego problemu. Możesz ocenić te podejścia wraz z losową inicjalizacją dla konkretnego problemu.

Jakie badania można przeprowadzić przy użyciu zestawu danych e-mail?

Znalazłem zestaw danych o nazwie Enron Email Dataset. Jest to prawdopodobnie jedyny znaczący zbiór „prawdziwych” e-maili, który jest dostępny publicznie. Znalazłem wcześniejszą analizę tej pracy: artykuł opisujący dane Enron został przedstawiony na konferencji CEAS w 2004 roku. Niektóre eksperymenty związane z tymi danymi opisano w domu Rona Bekkermana, strona Parakweet wydała otwarty zestaw danych dotyczących zdań Enron, oznaczonych jako akty mowy. Praca na University of Pennsylvania obejmuje zbiór danych zapytań do wyszukiwania wiadomości e-mail, a także narzędzie do generowania błędów ortograficznych w oparciu o korpus Enron. Szukam interesujących, aktualnych tematów do pracy. Proszę, daj mi kilka sugestii.

Uczysz się, prawda? Spróbuj znaleźć coś łatwego i interesującego na początek. Może zaczniesz od czegoś prostego, na przykład od zbudowania modelu Bayesa, aby przewidzieć, które e-maile zostaną usunięte. Powinieneś rzucić okiem na te usunięte e-maile, czy to spam? czy to tylko śmieci? Tutaj masz po prostu nadzorowany model, w którym zestaw danych już oznacza e-maile dla Ciebie (usunięte lub nie). Pomyśl o czymś prostym, takim jak słowa, tytuły, długość wiadomości e-mail itp. Sprawdź, czy możesz zbudować model przewidujący usunięcie wiadomości e-mail.

Poniżej przedstawiono niektóre badania, które można przeprowadzić na zestawie danych poczty e-mail:

analiza lingwistyczna w celu określenia skrótu wiadomości e-mail Kategoryzuj wiadomości e-mail jako spam / hamowanie przy użyciu technik uczenia maszynowego. identyfikowanie pojęć wyrażonych w zbiorze wiadomości e-mail i organizowanie ich w ontologię lub taksonomię do przeglądania

Wspaniały zbiór danych z wieloma możliwościami udoskonalenia umiejętności analizy tekstu! Moją pierwszą myślą byłoby wypróbowanie modelowania tematycznego na zbiorze danych. Jeśli używasz języka Python, istnieje biblioteka, której użyłem, o nazwie gensim, która zawiera dość dokładne samouczki ułatwiające rozpoczęcie pracy. Mój przyjaciel zrobił coś podobnego ze zbiorem danych Enron, używając równoległego przetwarzania wstępnego i rozproszonej, ukrytej alokacji Dirichleta do wnioskowania tematów w korpusie e-maili.

Skrobanie stron internetowych LinkedIn

Niedawno odkryłem nowy pakiet R do łączenia się z interfejsem API LinkedIn. Niestety API LinkedIn wydaje się dość ograniczone na początku; na przykład można uzyskać tylko podstawowe dane o firmach i to jest oddzielone od danych o osobach. Chcę uzyskać dane o wszystkich pracownikach danej firmy, które możesz zrobić ręcznie na stronie ale nie jest to możliwe za pośrednictwem interfejsu API. import.io byłby idealny, gdyby rozpoznał paginację LinkedIn (patrz koniec strony). Czy ktoś zna jakieś narzędzia do skrobania sieci lub techniki mające zastosowanie do obecnego formatu strony LinkedIn lub sposoby naginania API w celu przeprowadzenia bardziej elastycznej analizy? Najlepiej w R lub w Internecie, ale z pewnością otwarte na inne podejścia.

Beautiful Soup jest specjalnie zaprojektowana do indeksowania i skrobania stron internetowych, ale została napisana dla języka Python, a nie R:

http://www.crummy.com/software/BeautifulSoup/bs4/doc/

Odpowiedź od itdxer Scrapy to świetna biblioteka Pythona, która może pomóc Ci szybciej zeskrobać różne witryny i ulepszyć strukturę kodu. Nie wszystkie witryny można analizować za pomocą klasycznych narzędzi, ponieważ mogą one wykorzystywać dynamiczne tworzenie treści JS. Do tego zadania lepiej jest użyć Selenium (jest to framework do testowania stron internetowych, ale także świetne narzędzie do skrobania stron internetowych). Dla tej biblioteki jest też dostępna paczka Pythona. W Google możesz znaleźć kilka sztuczek, które pomogą Ci używać Selenium inside Scrapy i sprawić, że Twój kod będzie przejrzysty, uporządkowany i możesz używać kilku świetnych narzędzi do biblioteki Scrapy. Myślę, że Selenium byłby lepszym skrobakiem dla Linkedina niż klasyczne narzędzia. Jest dużo javascript i dynamicznej zawartości. Ponadto, jeśli chcesz dokonać uwierzytelnienia na swoim koncie i zeskrobać całą dostępną zawartość, będziesz mieć wiele problemów z klasycznym uwierzytelnianiem przy użyciu prostych bibliotek, takich jak żądania lub urllib.

Usługi internetowe do wyszukiwania sieci społecznościowej?

Czy istnieją usługi internetowe, które można wykorzystać do analizy danych w sieciach społecznościowych w odniesieniu do konkretnego pytania badawczego (np. Wzmianki o niektórych produktach w dyskusjach w mediach społecznościowych)?

Interfejs API Twittera jest jednym z najlepszych źródeł danych z sieci społecznościowych. Możesz wyodrębnić z Twittera prawie wszystko, co możesz sobie wyobrazić, potrzebujesz tylko konta i identyfikatora programisty. Dokumentacja jest dość obszerna, więc pozwolę ci się nią poruszać. https://dev.twitter.com/overview/documentation

Jak zwykle istnieją opakowania, które ułatwiają życie.

* python-twitter

*Twitter

Istnieją również firmy, które oferują za opłatą szczegółowe analizy Twittera i historyczne zbiory danych.

* Gnip

* Datasift

Sprawdź je!

Tweepy to jedna z najlepszych bibliotek do analizowania i hakowania za pomocą Twitter API. (Będąc współtwórcą tweepy, mogę ręczyć za jego stabilność i jakość) W przypadku opakowania w języku Python dla interfejsu Facebook Graph API możesz skorzystać z biblioteki Facebook-Insights, która jest dobrze utrzymaną i schludną dokumentacją. Istnieją usługi, które mogą wydobywać informacje, ale są one ograniczone do złożoności zapytania. Na przykład: „Ile osób tweetowało o bananie w poniedziałek?” można odpowiedzieć na podstawie istniejących narzędzi „Ile osób szczęśliwych ludzi napisało na Twitterze w poniedziałek o bananie”, ale wymagałoby to więcej wysiłku, a oprogramowanie lub narzędzie powinno być w stanie wykryć emocje. Tak więc, jeśli interesujesz się badaniami, radziłbym skorzystać z API i starego dobrego programowania!

Co to jest powtarzający się podgraf ciężki?

Niedawno w przemówieniu natknąłem się na ten termin powtarzający się ciężki podgraf. Wygląda na to, że nie rozumiem, co to znaczy, a Google nie wydaje żadnych dobrych wyników. Czy ktoś może szczegółowo wyjaśnić, co to oznacza.

Termin najlepiej można wyrazić jako powtarzający się, ciężki podgraf. To znaczy podgraf, który jest jednocześnie powtarzalny i ciężki. Ciężkość podgrafu odnosi się do mocno połączonych wierzchołków – czyli węzłów, które są połączone wielokrotnie („wiele” odnosi się do danej sieci). Powtarzalność odnosi się do skłonności podgrafu do występowania więcej niż jeden raz. Zatem powtarzający się ciężki podgraf jest gęsto połączonym zestawem wierzchołków, który występuje kilka razy w całej sieci. Podgrafy te są często używane do określania właściwości sieci. Na przykład: w sieci interakcji e-mailowych w firmie zorganizowanej w 4-osobowe zespoły, w których jeden członek pełni rolę lidera, aktywność e-mailową każdego zespołu (jeśli wysyłają e-maile między sobą na tyle, że można ich uznać za „ciężką”) można opisać jako ciężkie Podgraf. Fakt, że te podgrafy występują wielokrotnie w sieci, czyni je powtarzającymi się ciężkimi podgrafami. Gdyby ktoś szukał struktury w sieci, zauważenie, że istnieją te powtarzające się, ciężkie podgrafy, znacznie przyczyniłoby się do określenia organizacji sieci jako całości

[41][Klasyfikacja]

PYTANIA:

Używając SVM jako klasyfikatora binarnego, czy etykieta punktu danych jest wybierana w drodze konsensusu?

Uczę się maszyn wektorów pomocniczych i nie jestem w stanie zrozumieć, w jaki sposób jest wybierana etykieta klasy dla punktu danych w klasyfikatorze binarnym. Czy jest wybierany w drodze konsensusu w odniesieniu do klasyfikacji w każdym wymiarze oddzielającej hiperpłaszczyzny?

ODPOWIEDZI:

Termin konsensus, o ile mi wiadomo, jest używany raczej w przypadkach, gdy masz więcej niż jedno źródło miernika / miary / wybór, na podstawie którego możesz podjąć decyzję. Aby wybrać możliwy wynik, wykonujesz średnią ocenę / konsensus dla dostępnej wartości. Nie dotyczy to SVM. Algorytm opiera się na optymalizacji kwadratowej, która maksymalizuje odległość od najbliższych dokumentów dwóch różnych klas, wykorzystując hiperpłaszczyznę do wykonania podziału.

Tak więc jedynym konsensusem tutaj jest wynikowa hiperpłaszczyzna, obliczona na podstawie najbliższych dokumentów każdej klasy. Innymi słowy, klasy są przypisywane do każdego punktu poprzez obliczenie odległości od punktu do wyprowadzonej hiperpłaszczyzny. Jeśli odległość jest dodatnia, należy do określonej klasy, w przeciwnym razie należy do drugiej.

Wybierz algorytm klasyfikacji binarnej

Mam problem z klasyfikacją binarną:

* Około 1000 próbek w zestawie treningowym

* 10 atrybutów, w tym binarne, liczbowe i kategorialne

Który algorytm jest najlepszy do tego typu problemu?

Domyślnie zacznę od SVM (wstępna konwersja nominalnych wartości atrybutów na cechy binarne), ponieważ jest uważana za najlepszą dla stosunkowo czystych i niezakłóconych danych.

Trudno powiedzieć, nie wiedząc trochę więcej o swoim zbiorze danych i o tym, jak można go rozdzielić na podstawie wektora cech, ale prawdopodobnie sugerowałbym użycie ekstremalnego lasu losowego zamiast standardowych lasów losowych z powodu stosunkowo małego zestawu próbek. Ekstremalnie losowe lasy są bardzo podobne do standardowych lasów losowych z jednym wyjątkiem, że zamiast optymalizować podziały na drzewach, ekstremalnie losowe lasy powodują podziały losowo. Początkowo może się to wydawać negatywne, ale ogólnie oznacza to, że masz znacznie lepsze uogólnienie i szybkość, chociaż AUC na twoim zestawie treningowym jest prawdopodobnie być trochę gorszym. Regresja logistyczna jest również całkiem solidnym zakładem dla tego rodzaju zadań, chociaż przy waszej stosunkowo małej wymiarowości i małej wielkości próby obawiałbym się nadmiernego dopasowania. Możesz chcieć sprawdzić za pomocą K-Nearest Neighbors, ponieważ często działa bardzo dobrze przy małych wymiarach, ale zwykle nie radzi sobie zbyt dobrze ze zmiennymi kategorialnymi. Gdybym miał wybrać jeden, nie wiedząc więcej o problemie, z pewnością postawiłbym swoje zakłady na skrajnie losowy las, ponieważ jest bardzo prawdopodobne, że da ci dobre uogólnienie na tego rodzaju zestawach danych, a także lepiej radzi sobie z połączeniem danych liczbowych i kategorycznych niż większość innych metod.

W przypadku niskich parametrów, dość ograniczona wielkość próbki i regresja logistyczna klasyfikatora binarnego powinna być wystarczająco potężna. Możesz użyć bardziej zaawansowanego algorytmu, ale prawdopodobnie jest to przesada.

Gdy w mieszance są zmienne kategorialne, sięgam po Lasy losowych decyzji, ponieważ obsługuje ona zmienne kategorialne bezpośrednio, bez transformacji kodowania 1 z n. To powoduje utratę mniej informacji.

Personalizacja na dużą skalę – na użytkownika a modele globalne

Obecnie pracuję nad projektem, który skorzystałby na spersonalizowanych prognozach. Biorąc pod uwagę dokument wejściowy, zestaw dokumentów wyjściowych i historię zachowań użytkowników, chciałbym przewidzieć, które z dokumentów wyjściowych zostaną kliknięte. Krótko mówiąc, zastanawiam się, jakie jest typowe podejście do tego rodzaju problemu z personalizacją. Czy modele są szkolone dla każdego użytkownika, czy też pojedynczy model globalny bierze pod uwagę statystyki podsumowujące zachowanie użytkowników w przeszłości, aby pomóc w podjęciu decyzji? Modele na użytkownika nie będą dokładne, dopóki użytkownik nie będzie aktywny przez jakiś czas, podczas gdy większość modeli globalnych musi zostać ustalona jako wektor cech długości (co oznacza, że ​​musimy mniej więcej skompresować strumień przeszłych zdarzeń do mniejszej liczby statystyk podsumowujących).

Odpowiedź na to pytanie będzie się bardzo różnić w zależności od rozmiaru i charakteru danych. Na wysokim poziomie można by pomyśleć o tym jako o szczególnym przypadku modeli wielopoziomowych; masz możliwość oszacowania modelu z pełnym pulowaniem (czyli uniwersalnym modelem, który nie rozróżnia użytkowników), modelami bez pulowania (osobny model dla każdego użytkownika) i częściowo połączonymi modelami (mieszanka tych dwóch) . Jeśli jesteś zainteresowany, naprawdę powinieneś przeczytać Andrew Gelman na ten temat. Możesz również myśleć o tym jako o problemie związanym z uczeniem się do rangi, który albo próbuje wytworzyć punktowe oszacowania przy użyciu pojedynczej funkcji, albo zamiast tego próbuje zoptymalizować jakąś listową funkcję straty (np. NDCG). Podobnie jak w przypadku większości problemów związanych z uczeniem maszynowym, wszystko zależy od rodzaju posiadanych danych, ich jakości, rzadkości i rodzajów funkcji, które możesz z nich wyodrębnić. Jeśli masz powody, by sądzić, że każdy użytkownik będzie dość wyjątkowy w swoim zachowaniu, możesz chcieć zbudować model dla każdego użytkownika, ale będzie to nieporęczne szybkie – i co robisz, gdy masz do czynienia z nowy użytkownik?

Jakie metody klasyfikacyjne niezwiązane ze szkoleniem są dostępne?

Próbuję dowiedzieć się, które metody klasyfikacji, które nie wykorzystują fazy treningowej, są dostępne. Scenariusz jest klasyfikacją opartą na ekspresji genów, w której masz macierz ekspresji genów m genów (cech) i n próbek (obserwacje). Podaje się również podpis dla każdej klasy (jest to lista funkcji, które należy wziąć pod uwagę w celu zdefiniowania, do której klasy należy próbka). Aplikacja (nie będąca szkoleniem) jest metodą przewidywania najbliższego szablonu. W tym przypadku obliczana jest odległość cosinusowa między każdą próbką a każdą sygnaturą (na wspólnym zbiorze cech). Następnie każda próbka jest przypisywana do najbliższej klasy (porównanie próby z klasą skutkuje mniejszą odległością). W tym przypadku nie są potrzebne już sklasyfikowane próbki. Innym zastosowaniem (treningiem) jest metoda kNN, w której mamy zestaw już oznaczonych próbek. Następnie każda nowa próbka jest oznaczana w zależności od tego, jak oznaczono k najbliższych próbek. Czy istnieją inne metody niezwiązane z treningiem?

Pytasz o uczenie się oparte na instancjach. Metoda k-Nearest Neighbors (kNN) wydaje się być najpopularniejszą z tych metod i ma zastosowanie w wielu różnych dziedzinach problemowych. Innym ogólnym typem uczenia się opartego na instancjach jest modelowanie analogiczne, które wykorzystuje instancje jako przykłady do porównania z nowymi danymi.

Odniosłeś się do kNN jako aplikacji, która wykorzystuje szkolenie, ale to nie jest poprawne (wpis w Wikipedii, do którego jesteś podłączony, jest nieco mylący). Tak, istnieją „przykłady szkoleniowe” (oznaczone jako wystąpienia), ale klasyfikator nie uczy się / trenuje na podstawie tych danych. Są one raczej używane tylko wtedy, gdy rzeczywiście chcesz sklasyfikować nową instancję, dlatego jest ona uważana za „leniwego” ucznia. Zauważ, że metoda przewidywania najbliższego szablonu, o której wspominasz, jest formą kNN z k = 1 i odległością cosinusową jako miarą odległości.

Jestem początkującym w uczeniu maszynowym, więc wybaczcie mi ten prosty opis, ale wygląda na to, że możesz użyć modelowania tematycznego, takiego jak utajona analiza Dirichleta (LDA). Jest to algorytm szeroko stosowany do klasyfikowania dokumentów według tematów, których dotyczą, na podstawie znalezionych słów i względnej częstotliwości tych słów w całym korpusie. Poruszam to głównie dlatego, że w LDA nie ma potrzeby wcześniejszego definiowania tematów. Ponieważ strony pomocy w LDA są głównie napisane do analizy tekstu, analogia, której użyłbym, aby zastosować ją do twojego pytania, jest następująca: – Traktuj każdą ekspresję genu lub cechę jako “ słowo ” (czasami nazywane tokenem w typowe aplikacje do klasyfikacji tekstu LDA) – Traktuj każdą próbkę jak dokument (tj. zawiera zestaw słów lub wyrażeń genów) – Traktuj podpisy jako istniejące wcześniej tematy Jeśli się nie mylę, LDA powinno podać ważone prawdopodobieństwa dla każdego temat, jak mocno jest on obecny w każdym dokumencie.

 Jak zdefiniować niestandardową metodologię ponownego próbkowania

Używam projektu eksperymentalnego, aby przetestować solidność różnych metod klasyfikacji, a teraz szukam prawidłowej definicji takiego projektu. Tworzę różne podzbiory pełnego zbioru danych, wycinając kilka próbek. Każdy podzbiór jest tworzony niezależnie od innych. Następnie uruchamiam każdą metodę klasyfikacji na każdym podzbiorze. Na koniec oceniam dokładność każdej metody jako liczbę klasyfikacji podzbiorów zgodnych z klasyfikacją w pełnym zbiorze danych. Na przykład:

Classification-full 1 2 3 2 1 1 2

Classification-subset1 1 2 2 3 1

Classification-subset2 2 3 1 1 2…

Accuracy 1 1 1 1 0.5 1 1

Czy istnieje poprawna nazwa tej metodologii? Myślałem, że to może podlegać bootstrapowi, ale nie jestem tego pewien.

Losowe podpróbkowanie wydaje się odpowiednie, ładowanie początkowe jest nieco bardziej ogólne, ale także poprawne.

Wypaczone dane wieloklasowe

Mam zbiór danych zawierający ~ 100 000 próbek z 50 klas. Używam SVM z jądrem RBF do trenowania i przewidywania nowych danych. Problem polega jednak na tym, że zbiór danych jest wypaczony w kierunku różnych klas.

 Na przykład   Class 1 – 30 (~3% each), Class 31 – 45 (~0.6% each), Class 46 – 50 (~0.2% each)

Widzę, że model bardzo rzadko przewiduje klasy, które występują rzadziej w zbiorze uczącym, mimo że zbiór testowy ma taki sam rozkład klas jak zbiór uczący. Zdaję sobie sprawę, że istnieją techniki takie jak „undersampling”, w których klasa większości jest zmniejszana do klasy podrzędnej. Czy ma to jednak zastosowanie tutaj, gdzie jest tak wiele różnych klas? Czy istnieją inne metody, które pomogą rozwiązać ten przypadek?

Sugerowałbym użycie biblioteki libsvm, która ma już zaimplementowane regulowane wagi klas. Zamiast replikować próbki uczące, modyfikuje się parametr C dla różnych klas w optymalizacji SVM. Na przykład, jeśli twoje dane mają 2 klasy, a pierwsza klasa to tylko 10% danych, możesz wybrać wagi klas na 10 i 1 odpowiednio dla klasy 1 i 2. Dlatego naruszenia marginesów pierwszej klasy kosztowałyby 10 razy więcej niż naruszenia marginesów dla drugiej klasy, a dokładności dla poszczególnych klas byłyby bardziej zrównoważone.

Nie jestem ekspertem w używaniu maszyn SVM, ale zwykle (jeśli używasz biblioteki uczenia maszynowego, takiej jak scikit-learn Pythona lub libsvm w języku R, jest odpowiednio parametr class_weight lub class.weights. Lub jeśli używasz Bayesa klasyfikator, weźmiesz pod uwagę to „pochylenie” poprzez „wcześniejsze (klasowe) prawdopodobieństwa” P (ωj)

Podobieństwo cosinusowe a iloczyn skalarny jako metryki odległości

Wygląda na to, że podobieństwo cosinusowe dwóch cech jest po prostu ich iloczynem skalarnym skalowanym przez iloczyn ich wielkości. Kiedy podobieństwo cosinusowe jest lepszą miarą odległości niż iloczyn skalarny? To znaczy. Czy iloczyn skalarny i podobieństwo cosinusa mają różne mocne lub słabe strony w różnych sytuacjach?

Myśl geometrycznie. Podobieństwo cosinusowe dba tylko o różnicę kątów, podczas gdy iloczyn skalarny dba o kąt i wielkość. Jeśli znormalizujesz dane, aby miały tę samą wielkość, te dwa są nie do odróżnienia. Czasami pożądane jest zignorowanie wielkości, stąd podobieństwo cosinusowe jest dobre, ale jeśli wielkość odgrywa rolę, iloczyn skalarny byłby lepszy jako miara podobieństwa. Zwróć uwagę, że żaden z nich nie jest „miarą odległości”.

Masz rację, podobieństwo cosinusowe ma wiele wspólnego z iloczynem skalarnym wektorów. Rzeczywiście, jest to iloczyn skalarny skalowany według wielkości. Ze względu na skalowanie jest znormalizowany między 0 a 1. CS jest preferowane, ponieważ uwzględnia zmienność danych i względne częstotliwości cech. Z drugiej strony, zwykły iloczyn skalarny jest trochę „tańszy” (pod względem złożoności i implementacji).

Chciałbym dodać jeszcze jeden wymiar do odpowiedzi udzielonych powyżej. Zwykle używamy podobieństwa cosinusowego w przypadku dużego tekstu, ponieważ nie zaleca się używania macierzy odległości na akapitach danych. A także, jeśli zamierzasz, aby twoja klaster była szeroka, będziesz mieć tendencję do podobieństwa cosinusowego, ponieważ oddaje ogólne podobieństwo. Na przykład, jeśli masz teksty, które mają maksymalnie dwa lub trzy słowa, uważam, że użycie podobieństwa cosinusowego nie zapewnia precyzji, jaką uzyskuje się za pomocą metryki odległości.

Który typ weryfikacji krzyżowej najlepiej pasuje do problemu  klasyfikacji binarnej

Zbiór danych wygląda następująco:

25000 obserwacji do 15 predyktorów różnych typów: numeryczna, wieloklasowa jakościowa, binarna zmienna docelowa jest binarna Która metoda walidacji krzyżowej jest typowa dla tego typu problemów? Domyślnie używam K-Fold. Ile fałd wystarczy w tym przypadku? (Jednym z modeli, których używam, jest losowy las, który jest czasochłonny…)

Najlepsze wyniki osiągniesz, jeśli zechcesz zbudować fałdy tak, aby każda zmienna (a co najważniejsze zmienna docelowa) była w przybliżeniu identyczna w każdym fałdzie. Nazywa się to, w przypadku zastosowania do zmiennej docelowej, warstwowym k-krotnością. Jednym podejściem jest zgrupowanie danych wejściowych i upewnienie się, że każdy fałd zawiera taką samą liczbę wystąpień z każdego klastra, proporcjonalną do ich rozmiaru.

Myślę, że w twoim przypadku 10-krotne CV będzie OK. Myślę, że ważniejsze jest zrandomizowanie procesu walidacji krzyżowej niż wybranie idealnej wartości k. Powtórz więc proces CV kilka razy losowo i oblicz wariancję wyniku klasyfikacji, aby określić, czy wyniki są wiarygodne, czy nie.

Jaka jest różnica między klasyfikacją tekstu a modelami tematycznymi?

Znam różnicę między grupowaniem a klasyfikacją w uczeniu maszynowym, ale nie rozumiem różnicy między klasyfikacją tekstu a modelowaniem tematycznym dokumentów. Czy mogę użyć modelowania tematu na dokumentach, aby zidentyfikować temat? Czy mogę użyć metod klasyfikacji, aby sklasyfikować tekst w tych dokumentach?

Klasyfikacja tekstu

Daję ci kilka dokumentów, z których każdy ma dołączoną etykietę. Proszę was, abyście się dowiedzieli, dlaczego waszym zdaniem treść dokumentów otrzymała te etykiety na podstawie ich słów. Następnie daję Ci nowe dokumenty i pytam, jaka powinna być etykieta dla każdego z nich. Etykiety mają dla mnie znaczenie, niekoniecznie dla ciebie.

Modelowanie tematyczne

Daję ci kilka dokumentów bez etykiet. Proszę o wyjaśnienie, dlaczego dokumenty zawierają takie same słowa, jak te, które mają, poprzez wskazanie niektórych tematów, o których każdy „dotyczy”. Mówisz mi o tematach, mówiąc mi, ile z każdego z nich znajduje się w każdym dokumencie, a ja decyduję, jakie tematy

„Podły”, jeśli cokolwiek. Musiałbyś wyjaśnić, co ja, „określ jeden temat” lub „sklasyfikuj tekst”.

Ale nie wiem, jaka jest różnica między klasyfikacją tekstu a modelami tematycznymi w dokumentach Klasyfikacja tekstów jest formą nadzorowanego uczenia się – zestaw możliwych zajęć jest z góry znany / zdefiniowany i nie ulega zmianie. Modelowanie tematyczne jest formą uczenia się bez nadzoru (podobną do grupowania) – zbiór możliwych tematów to nieznane apriori. Są zdefiniowane jako część generowania modeli tematycznych. W przypadku niedeterministycznego algorytmu, takiego jak LDA, za każdym razem otrzymasz inne tematy uruchamiasz algorytm. Klasyfikacja tekstów często obejmuje wzajemnie wykluczające się klasy – należy je traktować jako zbiorniki. Ale nie musi – biorąc pod uwagę odpowiedni rodzaj oznaczonych danych wejściowych, można ustawić serię niewykluczających się wzajemnie klasyfikatorów binarnych. Modelowanie tematyczne generalnie nie wyklucza się wzajemnie – ten sam dokument może mieć rozkład prawdopodobieństwa rozłożony na wiele tematów. Ponadto istnieją hierarchiczne metody modelowania tematów itp. Czy mogę również użyć modelu tematu dla dokumentów, aby później zidentyfikować jeden temat. Czy mogę użyć klasyfikacji do sklasyfikowania tekstu w tych dokumentach? Jeśli pytasz, czy możesz wziąć wszystkie dokumenty przypisane do jednego tematu przez algorytm modelowania tematu, a następnie zastosować klasyfikator do tej kolekcji, to tak, z pewnością możesz to zrobić. Nie jestem jednak pewien, czy to ma sens – jako minimum musisz wybrać próg rozkładu prawdopodobieństwa tematu, powyżej którego uwzględnisz dokumenty w Twojej kolekcji (zwykle 0,05-0,1). Czy możesz rozwinąć swój przypadek użycia? Przy okazji, dostępny jest świetny samouczek dotyczący modelowania tematycznego przy użyciu biblioteki MALLET dla języka Java, dostępny tutaj: Pierwsze kroki z modelowaniem tematycznym i MALLET

Modele tematyczne są zwykle bez nadzoru. Istnieją również „nadzorowane modele tematyczne”; ale nawet wtedy próbują modelować tematy w ramach zajęć.

Na przykład. możesz mieć klasę „piłka nożna”, ale w ramach tej klasy mogą istnieć tematy związane z określonymi meczami lub drużynami. Wyzwanie związane z tematami polega na tym, że zmieniają się one w czasie; rozważ powyższy przykład meczów. Takie tematy mogą się pojawić i ponownie zniknąć.

Różnica między tf-idf i tf z Random Forests

Pracuję nad problemem klasyfikacji tekstu, używając Random Forest jako klasyfikatorów i podejścia bag-of-words. Używam podstawowej implementacji Random Forests (tej obecnej w scikit), która tworzy warunek binarny dla pojedynczej zmiennej przy każdym podziale. Biorąc to pod uwagę, czy istnieje różnica między używaniem prostych cech tf (częstotliwości terminów). gdzie każde słowo ma przypisaną wagę, która reprezentuje liczbę wystąpień w dokumencie lub tf-idf (częstotliwość terminu * odwrotna częstotliwość dokumentu), gdzie częstotliwość terminu jest również mnożona przez wartość, która reprezentuje stosunek całkowitej liczby dokumentów i liczbę dokumentów zawierających słowo)? Moim zdaniem nie powinno być żadnej różnicy między tymi dwoma podejściami, ponieważ jedyną różnicą jest współczynnik skalowania na każdej funkcji, ale ponieważ podział odbywa się na poziomie pojedynczych cech, nie powinno to robić różnicy.

Czy mam rację w swoim rozumowaniu?

Drzewa decyzyjne (a tym samym losowe lasy) są niewrażliwe na monotoniczne przekształcenia cech wejściowych. Ponieważ mnożenie przez ten sam współczynnik jest monotonną transformacją, założyłbym, że w przypadku Losowych Lasów rzeczywiście nie ma różnicy. Jednak w końcu możesz rozważyć użycie innych klasyfikatorów, które nie mają tej właściwości, więc nadal może mieć sens użycie całego TF * IDF.

Klasyfikacja dokumentów: tf-idf przed czy po filtrowaniu funkcji?

Mam projekt klasyfikacji dokumentów, w którym pobieram zawartość witryny, a następnie przypisuję do witryny jedną z wielu etykiet zgodnie z zawartością. Dowiedziałem się, że tf-idf może być do tego bardzo przydatne. Jednak nie byłem pewien, kiedy dokładnie go użyć. Zakładając, że strona internetowa zajmująca się określonym tematem wielokrotnie o tym wspomina, był to mój obecny proces:

  1. Pobierz zawartość witryny i przeanalizuj, aby znaleźć zwykły tekst
  2. Normalizuj i powstrzymuj zawartość
  3. Tokenizacja do unigramów (może też bigramów)
  4. Pobierz liczbę wszystkich unigramów dla danego dokumentu, filtrując słowa o małej długości i małej liczbie występujących słów
  5. Wytrenuj klasyfikator, taki jak NaiveBayes, na wynikowym zbiorze

Moje pytanie jest następujące: gdzie pasowałby tu tf-idf? Przed

normalizowanie / wyprowadzanie? Po normalizacji, ale przed tokenizacją? Po tokenizacji?

Każdy wgląd byłby bardzo mile widziany.

Po bliższym przyjrzeniu się, myślę, że mogłem mieć nieporozumienie co do tego, jak działa TF-IDF. W powyższym kroku 4, który opisuję, czy musiałbym od razu wprowadzić całość moich danych do TF-IDF? Jeśli na przykład moje dane są następujące:

[({tokenized_content_site1}, category_string_site1),

({tokenized_content_site2}, category_string_site2),

({tokenized_content_siten}, category_string_siten)}]

Tutaj najbardziej zewnętrzna struktura jest listą zawierającą krotki, zawierającą słownik (lub hashmap) i ciąg. Czy musiałbym od razu wprowadzić całość tych danych do kalkulatora TF-IDF, aby osiągnąć pożądany efekt? W szczególności patrzyłem na TfidfVectorizer scikit-learn, aby to zrobić, ale jestem trochę niepewny co do jego użycia, ponieważ przykłady są dość rzadkie.

Jak to opisałeś, krok 4 to miejsce, w którym chcesz użyć TF-IDF. Zasadniczo TD-IDF policzy każdy termin w każdym dokumencie i przypisze punktację, biorąc pod uwagę względną częstotliwość w całym zbiorze dokumentów. Brakuje jednak jednego dużego kroku w procesie: dodawania adnotacji do zestawu treningowego. Zanim wytrenujesz klasyfikator, musisz ręcznie dodać adnotacje do próbki danych etykietami, które chcesz mieć możliwość automatycznego stosowania za pomocą klasyfikatora. Aby to wszystko ułatwić, możesz rozważyć użycie klasyfikatora Stanford. To wykona wyodrębnianie cech i zbuduje model klasyfikatora (obsługujący kilka różnych algorytmów uczenia maszynowego), ale nadal będziesz musiał ręcznie dodawać adnotacje do danych szkoleniowych.

K-Nearest Neighbors

Czy algorytm k-najbliższego sąsiada jest klasyfikatorem dyskryminacyjnym czy generującym? Po raz pierwszy pomyślałem o tym, że jest generatywny, ponieważ faktycznie używa twierdzenia Bayesa do obliczenia późniejszego. Szukając dalej tego, wydaje się, że jest to model dyskryminacyjny, ale nie mogłem znaleźć wyjaśnienia. Czy więc KNN jest przede wszystkim dyskryminujący? A jeśli tak, czy to dlatego, że nie modeluje wyprzedzeń ani prawdopodobieństwa?

Zobacz podobną odpowiedź tutaj. Aby wyjaśnić, k- najbliższy sąsiad jest klasyfikatorem dyskryminacyjnym. Różnica między klasyfikatorem generatywnym a dyskryminacyjnym polega na tym, że pierwszy modeluje wspólne prawdopodobieństwo, podczas gdy drugi modeluje prawdopodobieństwo warunkowe (późniejsze), zaczynając od poprzedniego. W przypadku najbliższych sąsiadów modelowane jest prawdopodobieństwo warunkowe klasy dla danego punktu danych. Aby to zrobić, należy zacząć od wcześniejszego prawdopodobieństwa na zajęciach.

Drzewo decyzyjne czy regresja logistyczna?

Pracuję nad problemem klasyfikacyjnym. Mam zbiór danych zawierający równą liczbę zmiennych kategorialnych i ciągłych. Skąd mam wiedzieć, jakiej techniki użyć? między drzewem decyzyjnym a regresją logistyczną? Czy słuszne jest założenie, że regresja logistyczna będzie bardziej odpowiednia dla zmiennej ciągłej, a drzewo decyzyjne będzie bardziej odpowiednie dla zmiennej ciągłej + jakościowej?

Krótko mówiąc: rób to, co powiedział @untledprogrammer, wypróbuj oba modele i sprawdź krzyżowo, aby pomóc wybrać jeden. Zarówno drzewa decyzyjne (w zależności od implementacji, np. C4.5), jak i regresja logistyczna powinny dobrze radzić sobie z danymi ciągłymi i kategorialnymi. W przypadku regresji logistycznej warto zakodować fikcyjnie zmienne kategorialne.

Jak wspomniał @untitledprogrammer, trudno jest z góry ustalić, która technika będzie lepiej oparta po prostu na typie posiadanych funkcji, ciągłych lub innych. To naprawdę zależy od konkretnego problemu i posiadanych danych. Należy jednak pamiętać, że model regresji logistycznej szuka pojedynczej liniowej granicy decyzyjnej w przestrzeni cech, podczas gdy drzewo decyzyjne zasadniczo dzieli przestrzeń funkcji na półprzestrzenie przy użyciu liniowych granic decyzyjnych wyrównanych do osi. Efekt netto jest taki, że masz nieliniową granicę decyzyjną, prawdopodobnie więcej niż jedną. Jest to przyjemne, gdy punktów danych nie można łatwo oddzielić pojedynczą hiperpłaszczyzną, ale z drugiej strony drzewa decyzyjne są tak elastyczne, że mogą być podatne na nadmierne dopasowanie. Aby temu zaradzić, możesz spróbować przycinania. Regresja logistyczna jest zwykle mniej podatna (ale nie odporna!) Na nadmierne dopasowanie. Na koniec kolejną kwestią do rozważenia jest to, że drzewa decyzyjne mogą automatycznie uwzględniać interakcje między zmiennymi, np. jeśli masz dwie niezależne funkcje i. W przypadku regresji logistycznej musisz ręcznie dodać te terminy interakcji samodzielnie.

Musisz więc zadać sobie pytanie: jaki rodzaj granicy decyzyjnej ma większy sens w twoim konkretnym problemie? jak chcesz zrównoważyć odchylenie i wariancję? czy istnieją interakcje między moimi funkcjami?

Oczywiście zawsze dobrze jest po prostu wypróbować oba modele i przeprowadzić weryfikację krzyżową. To xy pomoże ci dowiedzieć się, który z nich bardziej przypomina lepszy błąd generalizacji.

Spróbuj użyć zarówno drzew regresyjnych, jak i decyzyjnych. Porównaj skuteczność każdej techniki, używając 10-krotnej weryfikacji krzyżowej. Trzymaj się tego o wyższej wydajności. Trudno byłoby ocenić, która metoda byłaby lepsza, wiedząc, że zbiór danych jest ciągły i / lub kategoryczny.

[40][Sieci Neuronowe]

Sieci neuronowe tradycyjnie odnoszą się do sieci lub obwodu neuronów biologicznych. Współczesne użycie tego terminu często odnosi się do sztucznych sieci neuronowych (SSN), które składają się ze sztucznych neuronów lub węzłów – konstruktów programistycznych naśladujących właściwości neuronów biologicznych. Zestaw ważonych połączeń między neuronami umożliwia propagację informacji w sieci w celu rozwiązania problemów sztucznej inteligencji bez konieczności posiadania przez projektanta sieci modelu rzeczywistego systemu. Celem jest dobra lub ludzka zdolność przewidywania.

PYTANIA:

Wielowarstwowa propagacja wsteczna. Sieć neuronowa do klasyfikacji

Czy ktoś może mi wyjaśnić, jak sklasyfikować dane takie jak MNIST z siecią MLBP-Neural, jeśli wykonuję więcej niż jedno wyjście (np. 8), to znaczy, jeśli używam tylko jednego wyjścia, mogę łatwo klasyfikować dane, ale jeśli używam więcej niż jeden, które wyjście powinienem wybrać?

ODPOWIEDZI:

Załóżmy, że musisz sklasyfikować coś w klasach K, gdzie K > 2. W tym przypadku najczęściej używam konfiguracji jednego kodowania na gorąco. Będziesz mieć K kolumn wyjściowych, a w zbiorze uczącym ustawisz wszystkie wartości na 0, z wyjątkiem tej, która ma indeks kategorii, który może mieć wartość 1. Zatem dla każdej instancji zestawu danych uczących będziesz mieć wszystkie wyniki z wartościami 0 lub 1, wszystkie wyjścia sumują się do 1 dla każdej instancji.

To wygląda na prawdopodobieństwo, które przypomina mi technikę używaną często do łączenia niektórych wyników, które są modelowane jako prawdopodobieństwo. Nazywa się to funkcją softmax, więcej szczegółów w Wikipedii. Pozwoli to na nałożenie pewnych ograniczeń na wartości wyjściowe (jest to w zasadzie uogólnienie funkcji logistycznej), tak aby wartości wyjściowe były modelowane jako prawdopodobieństwa. Wreszcie, z lub bez softmax, możesz użyć wyjścia jako funkcji dyskryminacyjnej, aby wybrać odpowiednią kategorię. Kolejną ostatnią myślą byłoby uniknięcie kodowania zmiennych w połączony sposób. Na przykład możesz mieć binarną reprezentację indeksu kategorii. Spowodowałoby to u uczącego się sztuczne połączenie między niektórymi wynikami, które są arbitralne. Jedyne kodowanie na gorąco ma tę zaletę, że jest neutralne dla sposobu indeksowania etykiet.

Wszelkie różnice w regularyzacji w MLP między partiami i indywidualne aktualizacje?

Właśnie dowiedziałem się o regularyzacji jako podejściu do kontroli nadmiernego dopasowania i chciałbym włączyć ten pomysł do prostej implementacji wstecznej propagacji i wielowarstwowego perceptronu (MLP), które razem złożyłem. Obecnie, aby uniknąć nadmiernego dopasowania, przeprowadzam weryfikację krzyżową i utrzymuję sieć z najlepszym dotychczas wynikiem w zestawie walidacyjnym. Działa to dobrze, ale dodanie regularyzacji przyniosłoby mi korzyści, ponieważ prawidłowy wybór algorytmu regularyzacji i parametru spowodowałby, że moja sieć zbiegałaby się w sposób bardziej systematyczny do modelu nieprzekraczającego. Formuła, którą mam na termin aktualizacji (z kursu Coursera ML) jest podana jako aktualizacja partii, np. dla każdej wagi, po zsumowaniu wszystkich odpowiednich delt dla całego zbioru uczącego z propagacji błędu, dodaje się korektę lambda * current_weight, a także przed odjęciem połączonej delty na końcu partii, gdzie lambda jest parametrem regularyzacji. Moja implementacja wstecznej propagacji wykorzystuje aktualizacje wagi poszczególnych pozycji. Obawiam się, że nie mogę po prostu skopiować podejścia wsadowego, chociaż intuicyjnie wydaje mi się to OK. Czy mniejszy okres regularyzacji na element działa równie dobrze? Na przykład lambda * aktualna_waga / N, gdzie N to rozmiar zestawu treningowego – na początku na pierwszy rzut oka wygląda to rozsądnie. Nie mogłem jednak znaleźć nic na ten temat i zastanawiam się, czy to dlatego, że regularyzacja nie działa tak dobrze z aktualizacją dla poszczególnych pozycji, czy nawet ma inną nazwę lub zmienioną formułę.

Regularyzacja ma również znaczenie w uczeniu się według poszczególnych elementów. Proponuję rozpocząć od podstawowego podejścia do walidacji, aby dowiedzieć się, czy lambda jest uczeniem wsadowym, czy jednostkowym. To najłatwiejsze i najbezpieczniejsze podejście. Spróbuj ręcznie z kilkoma różnymi wartościami. na przykład 0,001. 0,003, 0,01, 0,03, 0,1 itd. I zobacz, jak zachowuje się Twój zestaw walidacyjny. Później możesz zautomatyzować ten proces, wprowadzając liniową lub lokalną metodę wyszukiwania. Na marginesie uważam, że wartość lambda należy rozpatrywać w odniesieniu do aktualizacji wektora parametrów, a nie rozmiaru zestawu uczącego. W przypadku uczenia wsadowego masz jedną aktualizację parametrów na przebieg zestawu danych, natomiast w przypadku uczenia online jedną aktualizację na próbkę (niezależnie od rozmiaru zestawu uczącego).

Regularyzacja jest używana podczas obliczania wstecznej propagacji wszystkich wag w twoim MLP. Dlatego zamiast obliczać gradient w odniesieniu do wszystkich danych wejściowych zbioru uczącego (partii), używasz tylko jednej / jednej pozycji (stochastyczna lub półstochastyczna). Ostatecznie ograniczysz wynik aktualizacji do jednego przedmiotu, a nie do wszystkich, co również jest poprawne. Ponadto, jeśli dobrze pamiętam, Andrew NG użył regularyzacji L2. / N w lambda * aktualna_waga / N nie jest obowiązkowa, po prostu pomaga przeskalować dane wejściowe. Jeśli jednak zdecydujesz się jej nie używać, będziesz musiał (w większości przypadków) wybrać inną wartość lambda. Możesz również użyć algorytmu wyszukiwania w siatce, aby wybrać najlepszą wartość dla lambda (hiperparametr => ten, który musisz wybrać).

Jak walczyć z niedopasowaniem w głębokiej sieci neuronowej

Kiedy zacząłem od sztucznych sieci neuronowych (NN), pomyślałem, że będę musiał walczyć z nadmiernym dopasowaniem jako głównym problemem. Ale w praktyce nie mogę nawet zmusić mojego NN do przekroczenia 20% bariery błędu. Nie mogę nawet pobić swojego wyniku w losowym lesie! Szukam bardzo ogólnych lub mniej ogólnych porad na temat tego, co należy zrobić, aby NN zaczął rejestrować trendy w danych. Do implementacji NN używam Theano Stacked Auto Encoder z kodem z tutoriala, który działa świetnie (mniej niż 5% współczynnik błędów) do klasyfikowania zbioru danych MNIST. Jest to wielowarstwowy perceptron, z warstwą softmax na górze, a każdy ukryty później jest wstępnie trenowany jako autoenkoder (w pełni opisany w samouczku, rozdział 8). Istnieje ~ 50 funkcji wejściowych i ~ 10 klas wyjściowych. NN ma neurony esicy i wszystkie dane są znormalizowane do [0,1]. Próbowałem wielu różnych konfiguracji: liczba ukrytych warstw i neuronów w nich (100-> 100-> 100, 60-> 60-> 60, 60-> 30-> 15 itd.), Różne uczenie się i wstępne szkolenie stawki itp. A najlepsze, co mogę uzyskać, to 20% poziom błędów w zestawie walidacyjnym i 40% poziom błędów w zestawie testowym. Z drugiej strony, gdy próbuję użyć Random Forest (od scikit-learn), łatwo uzyskuję 12% poziom błędów w zbiorze walidacyjnym i 25% (!) w zbiorze testowym. Jak to możliwe, że moje głębokie NN z przedtreningiem zachowuje się tak źle? Czego powinienem spróbować?

Problem z głębokimi sieciami polega na tym, że mają one wiele hiperparametrów do dostrojenia i bardzo małą przestrzeń na rozwiązania. Zatem znalezienie dobrych jest bardziej jak sztuka niż zadanie inżynierskie. Zacząłbym od praktycznego przykładu z samouczka i bawiłbym się jego parametrami, aby zobaczyć, jak zmieniają się wyniki – daje to dobrą intuicję (choć nie formalne wyjaśnienie) na temat zależności między parametrami a wynikami (zarówno końcowymi, jak i pośrednimi). Bardzo przydatne okazały się również następujące artykuły: Visual Debugging Restricted Boltzmann Machine Training z przykładem 3D Praktyczny przewodnik po szkoleniu Ograniczone Boltzmann Machines Oba opisują RBM, ale zawierają ogólne spostrzeżenia na temat głębokich sieci. Na przykład, jednym z kluczowych punktów jest to, że sieci muszą być debugowane na poziomie warstwy – jeśli poprzednia warstwa nie zapewnia dobrej reprezentacji funkcji, kolejne warstwy prawie nie mają szans, aby to naprawić.

Chociaż odpowiedź zawiera kilka doskonałych wskazówek, które pomogą dowiedzieć się więcej o tym, jak sieci neuronowe mogą być (niezwykle) trudne do poprawnego dostrojenia, pomyślałem, że pomocne może być wymienienie kilku konkretnych technik, które są obecnie używane w klasyfikacji o najwyższej wydajności architektury w literaturze sieci neuronowej.

Rektyfikowane aktywacje liniowe

Pierwszą rzeczą, która może pomóc w twoim przypadku, jest zmiana funkcji aktywacji modelu z logistycznej sigmoidy – f (z) = (1 + = e <sup> -z </sup>) <sup> -1 </sup> – do wyprostowanej liniowej (aka relu) – f (z) = max (0, z).

Aktywacja relu ma dwie duże zalety:

* jego wyjście to prawdziwe zero (a nie tylko mała wartość bliska zeru) dla i

* jego pochodna jest stała, 0 dla lub 1 dla.

Sieć jednostek relu zasadniczo działa jak zbiór wykładniczo wielu sieci liniowych, ponieważ jednostki, które otrzymują dane wejściowe, są zasadniczo „wyłączone” (ich wyjście wynosi 0), podczas gdy jednostki, które otrzymują dane wejściowe, zapadają się w pojedynczy model liniowy dla tego wejścia. Również stałe pochodne są ważne, ponieważ głęboka sieć z aktywacjami relu ma tendencję do unikania problemu znikającego gradientu i można ją trenować bez warstwowego wstępnego treningu.

Dropout

Wiele grup badawczych w ciągu ostatnich kilku lat opowiadało się za stosowaniem „przerywania” w sieciach klasyfikatorów, aby uniknąć przetrenowania. W przypadku rezygnacji podczas uczenia pewna stała proporcja jednostek w danej warstwie jest losowo ustawiana na 0 dla każdego wejścia przetwarzanego przez sieć. Zmusza to jednostki, które nie są ustawione na 0, do „nadrabiania” „brakujących” jednostek. Dropout wydaje się być niezwykle skutecznym regulatorem modeli sieci neuronowych w zadaniach klasyfikacyjnych.

Gdy głębsze sieci są w stanie zacząć konwergencję, ujawniono problem degradacji: wraz ze wzrostem głębokości sieci dokładność zostaje nasycona (co może nie być zaskakujące), a następnie szybko spada. Nieoczekiwanie taka degradacja nie jest spowodowana nadmiernym dopasowaniem, a dodanie większej liczby warstw do odpowiednio głębokiego modelu prowadzi do większego błędu uczenia, co zostało dokładnie zweryfikowane przez nasze eksperymenty. Aby rozwiązać ten problem, wykorzystali architekturę pomijania. Dzięki temu wyszkolili bardzo głębokie sieci (1202 warstwy) i osiągnęli najlepszy wynik w wyzwaniu ILSVRC 2015

Sieć neuronowa analizuje ciąg danych?

Więc dopiero zaczynam się uczyć, jak sieć neuronowa może działać, aby rozpoznawać wzorce i kategoryzować dane wejściowe, i widziałem, jak sztuczna sieć neuronowa może analizować dane obrazu i kategoryzować obrazy (demo z convnetjs), a klucz tam polega na zmniejszeniu rozdzielczości obrazu, a każdy piksel stymuluje jeden neuron wejściowy do sieci. Próbuję jednak zawinąć głowę, czy można to zrobić za pomocą danych wejściowych? Przykład użycia, który mam, to „mechanizm rekomendacji” dla filmów, które oglądał użytkownik. Filmy mają wiele danych tekstowych (tytuł, fabuła, tagi) i mogę sobie wyobrazić „zmniejszenie próbkowania” tekstu do kilku kluczowych słów opisujących ten film, ale nawet jeśli przeanalizuję pięć pierwszych słów opisujących ten film, myślisz, że potrzebowałbym neuronów wejściowych dla każdego angielskiego słowa, aby porównać zestaw filmów? Mógłbym ograniczyć neurony wejściowe tylko do słów użytych w zestawie, ale czy potem może się rozwijać / uczyć, dodając nowe filmy (użytkownik ogląda nowy film z nowymi słowami)? Większość bibliotek, które widziałem, nie pozwala na dodawanie nowych neuronów po przeszkoleniu systemu? Czy istnieje standardowy sposób mapowania danych ciągów / słów / znaków na dane wejściowe w sieci neuronowej? A może sieć neuronowa naprawdę nie jest odpowiednim narzędziem do analizowania danych łańcuchowych, takich jak to (jakie jest lepsze narzędzie do dopasowywania wzorców w danych łańcuchowych)?

Korzystanie z sieci neuronowej do przewidywania danych w języku naturalnym może być trudnym zadaniem, ale istnieją wypróbowane i prawdziwe metody umożliwiające to. W polu Przetwarzanie języka naturalnego (NLP) tekst jest często przedstawiany za pomocą modelu zbioru słów. Innymi słowy, masz wektor o długości n, gdzie n to liczba słów w Twoim słowniku, a każde słowo odpowiada elementowi w wektorze. Aby przekonwertować tekst na dane liczbowe, wystarczy policzyć liczbę wystąpień każdego słowa i umieścić tę wartość w indeksie wektora, który odpowiada słowu. Wikipedia doskonale opisuje ten proces konwersji. Ponieważ długość vector jest naprawiony, trudno jest poradzić sobie z nowymi słowami, które nie są mapowane do indeksu, ale istnieją sposoby na złagodzenie tego problemu (haszowanie funkcji wyszukiwania). Ta metoda reprezentacji ma wiele wad – nie zachowuje relacji między sąsiednimi słowami i skutkuje bardzo rzadkimi wektorami. Spojrzenie na ngramy pomaga rozwiązać problem zachowania relacji między wyrazami, ale na razie skupmy się na drugim problemie: rzadkość. Trudno jest bezpośrednio poradzić sobie z tymi rzadkimi wektorami (wiele bibliotek algebry liniowej słabo radzi sobie z rzadkimi danymi wejściowymi), dlatego często następnym krokiem jest redukcja wymiarowości. W tym celu możemy odwołać się do dziedziny modelowania tematycznego: Techniki takie jak ukryta alokacja Dirichleta (LDA) i ukryta analiza semantyczna (LSA) umożliwiają kompresję tych rzadkich wektorów do gęstych wektorów poprzez przedstawienie dokumentu jako kombinacji tematów. Możesz ustalić liczbę używanych tematów, a robiąc to, ustalić rozmiar wektora wyjściowego produkowanego przez LDA lub LSA. Ten proces redukcji wymiarowości drastycznie zmniejsza rozmiar wektora wejściowego, próbując jednocześnie utracić minimalną ilość informacji. Wreszcie, po wszystkich tych konwersjach, możesz wprowadzić dane wyjściowe procesu modelowania tematu do wejść sieci neuronowej.

Nie dotyczy to sieci neuronowych jako takich, ale reprezentowania danych tekstowych w uczeniu maszynowym. Możesz reprezentować filmy, obsadę i motyw jako zmienne kategorialne. Fabuła jest bardziej skomplikowana; prawdopodobnie chciałbyś mieć do tego model tematyczny, ale odejdę to się skończy, dopóki nie zrozumiesz rzeczy. Robi dokładnie ten tekstowy „downsampling”, o którym wspomniałeś. Zapoznaj się z tym samouczkiem, aby dowiedzieć się, jak kodować zmienne kategorialne dla sieci neuronowych.

Wcześniejsze odpowiedzi mogą zawierać dobre uwagi dotyczące omawianego problemu. Problem polega na tym, że reprezentujesz swój łańcuch jako wektor cech do wprowadzenia do NN. Po pierwsze, problem zależy od rozmiaru ciągu, który chcesz przetworzyć. Długie ciągi zawierające żetony majów (zwykle słowa) są często nazywane dokumentami w tym ustawieniu. Istnieją oddzielne metody postępowania z pojedynczymi żetonami / słowami. Istnieje wiele sposobów przedstawiania dokumentów. Wielu z nich przyjmuje założenie z worka słów. Najprostsze typy przedstawiają dokument jako wektor zliczeń słów lub częstotliwości terminów (tf). Aby wyeliminować wpływ długości dokumentu,

Zwykle ludzie wolą normalizować liczbę dokumentów, w których pojawia się termin, częstotliwość dokumentów (tf-idf). Innym podejściem jest modelowanie tematyczne, które uczy się ukrytych niższych wymiarów reprezentacji danych. LDA i LSI / LSA to typowe wybory, ale należy pamiętać, że nie jest to nadzorowane. Wyuczona reprezentacja niekoniecznie będzie idealna do jakiejkolwiek nadzorowanej nauki, którą prowadzisz ze swoim NN. Jeśli chcesz tworzyć modele tematyczne, możesz także wypróbować nadzorowane modele tematyczne. W przypadku pojedynczych słów możesz użyć word2vec, który wykorzystuje NN do osadzania słów w przestrzeni o dowolnej wielkości. Podobieństwo między dwoma wektorami słów w tej wyuczonej przestrzeni zwykle odpowiada podobieństwu semantycznemu. Niedawno pionierskim podejściem są wektory akapitowe, które najpierw uczą się modelu słów podobnego do word2vec, a następnie budują na tej reprezentacji rozproszoną reprezentację zestawów słów (dokumentów dowolnej wielkości). To pokazało najnowocześniejsze wyniki w wielu zastosowaniach. Podczas korzystania z sieci NN w NLP ludzie często używają różnych architektur, takich jak cykliczne sieci neuronowe (takie jak sieci pamięci długoterminowej). W niektórych przypadkach ludzie używali nawet konwolucyjnych sieci neuronowych w tekście.

W jaki sposób sieci neuronowe są powiązane z transformatami Fouriera?

To jest pytanie z wywiadu W jaki sposób sieci neuronowe są powiązane z transformatami Fouriera? Mogłem znaleźć artykuły, które mówią o metodach przetwarzania dyskretnej transformaty Fouriera (DFT) przez jednowarstwową sieć neuronową z liniową funkcją przenoszenia. Czy jest jakaś inna korelacja, której mi brakuje?

Nie są ze sobą powiązane w żadnym sensownym sensie. Oczywiście, możesz ich używać do wyodrębniania funkcji lub wykonywania dowolnej liczby rzeczy, ale to samo można powiedzieć o wielu technikach. Zapytałbym „jakiego rodzaju sieć neuronową?” aby sprawdzić, czy ankieter miał na myśli coś konkretnego.

Podobieństwo to regresja. NNs mogą być używane do regresji, a transformata Fouriera jest w swoim sercu po prostu dopasowaniem krzywej wielu funkcji sin i cos do niektórych danych.

Co to jest sprzężone zejście w gradiencie?

Co to jest sprzężone gradientowe zejście sieci neuronowej? Czym różni się od techniki Gradient Descent? Natknąłem się na zasób, ale nie byłem w stanie zrozumieć różnicy między tymi dwiema metodami. W procedurze wspomniano, że następny kierunek wyszukiwania jest określany tak, że jest sprzężony z poprzednimi kierunkami wyszukiwania. Co to zdanie oznacza? O czym jest mowa o wyszukiwaniu liniowym na stronie internetowej? Czy ktoś może to wyjaśnić za pomocą diagramu?

Co to zdanie oznacza? Oznacza to, że następny wektor powinien być prostopadły do wszystkich poprzednich względem macierzy. To tak, jak naturalne wektory bazowe są do siebie prostopadłe,

z dodatkiem skrętu matrycy:

xTAy =   zamiast  xTy = 0, o czym jest mowa o wyszukiwaniu liniowym na stronie internetowej? Przeszukiwanie liniowe to metoda optymalizacji polegająca na odgadywaniu, jak daleko w danym kierunku (tj. Wzdłuż linii) należy się poruszać, aby najlepiej osiągnąć lokalne minimum.

Właściwości do budowy wielowarstwowej sieci neuronowej Perceptron przy użyciu Keras?

Próbuję zbudować i wytrenować wielowarstwową sieć neuronową perceptronu, która prawidłowo przewiduje, co prezydent wygrał w jakim hrabstwie po raz pierwszy. Mam następujące informacje dotyczące danych treningowych. Ludność ogółem Mediana wieku% kawalerów Stopień bezrobocia lub więcej Stopa bezrobocia Dochód na mieszkańca Ogółem gospodarstwa domowe Średnia wielkość gospodarstwa domowego% Mieszkania zajmowane przez właścicieli% Mieszkania zajmowane przez najemców% Mieszkania puste Mediana wartości domu Wzrost liczby ludności Wzrost liczby gospodarstw domowych Wzrost dochodu na mieszkańca Zwycięzca To 14 kolumn danych szkoleniowych i 15. kolumna jest tym, jakie powinno być wyjście. Próbuję użyć Keras do zbudowania wielowarstwowej sieci neuronowej perceptronu, ale potrzebuję pomocy w zrozumieniu kilku właściwości i zalet i wad wyboru różnych opcji dla tych właściwości.

  1. FUNKCJA AKTYWACJI

Wiem, że moim pierwszym krokiem jest wymyślenie funkcji aktywacji. Zawsze badałem sieci neuronowe wykorzystujące sigmoidalne funkcje aktywacji. Czy funkcja aktywacji esicy jest najlepsza? Skąd wiesz, którego użyć? Keras dodatkowo daje możliwość korzystania z funkcji aktywacji softmax, softplus, relu, tanh, linear lub hard_sigmoid. Nie przeszkadza mi

używając czegokolwiek, ale chcę tylko być w stanie zrozumieć, dlaczego i wady i zalety.

  1. PRAWDOPODOBIEŃSTWO INICJALIZACJI

Wiem, że inicjalizacje definiują rozkład prawdopodobieństwa używany do ustawiania początkowych losowych wag warstw Keras. Opcje, które daje Keras to uniform lecun_uniform, normal, identity, orthogonal, zero, glorot_normal, glorot_uniform, he_normal i he_uniform. Jak mój wybór tutaj wpływa na mój wynik końcowy lub model? Czy nie powinno to mieć znaczenia, ponieważ „trenujemy” dowolny model losowy, od którego zaczynamy, i tak czy inaczej wymyślamy bardziej optymalne wyważenie warstw?

1) Aktywacja to wybór architektury, który sprowadza się do wyboru hiperparametru. Możesz przedstawić teoretyczny argument za używaniem dowolnej funkcji, ale najlepszym sposobem ustalenia tego jest wypróbowanie kilku i ocena w zbiorze walidacyjnym. Należy również pamiętać, że można łączyć i dopasowywać aktywacje różnych warstw.

2) Teoretycznie tak, wiele losowych inicjalizacji byłoby takich samych, gdyby dane były wyjątkowo dobrze zachowane, a sieć była idealna. Jednak w praktyce inicjalizacje mają na celu zapewnienie rozsądnego startu gradientu i prawidłowej propagacji sygnału wstecz. Prawdopodobnie w tym przypadku którakolwiek z tych inicjalizacji będzie działać podobnie, ale najlepszym podejściem jest ich wypróbowanie i przełączenie, jeśli uzyskasz niepożądane wyniki.

[39][Statystyka]

PYTANIA:

Czy istnieje zamiennik małych wartości p w dużych zbiorach danych?

Jeśli w dużych zbiorach danych jest dużo małych wartości p, jakie jest porównywalne zastąpienie wartości p w danych z milionami próbek?

ODPOWIEDZI:

Nie ma zamiennika w ścisłym znaczeniu tego słowa. Zamiast tego powinieneś przyjrzeć się innym miarom. Inne miary, na które patrzysz, zależą od rodzaju problemu, który rozwiązujesz. Ogólnie rzecz biorąc, jeśli masz małą wartość p, rozważ także wielkość efektu. Może być bardzo istotne statystycznie, ale w praktyce bez znaczenia. Pomocne jest również podanie przedziału ufności wielkości efektu.

Kiedy wartości p są mylące? Gdy istnieje wiele zmiennych, które można przetestować pod kątem korelacji parami (na przykład), zastąpieniem jest użycie dowolnej z poprawek współczynnika fałszywych odkryć (w celu ograniczenia prawdopodobieństwa, że ​​dane odkrycie jest fałszywe) lub współczynnika błędów rodzinnych ( aby ograniczyć prawdopodobieństwo jednego lub więcej fałszywych odkryć). Na przykład możesz użyć metody Holma – Bonferroniego. W przypadku dużej próbki, a nie wielu zmiennych, potrzebne jest coś innego. Jak powiedział Christopher, wielkość efektu jest sposobem na rozwiązanie tego problemu. Łącząc te dwie idee, możesz użyć przedziału ufności wokół wielkości efektu i zastosować fałsz korekta współczynnika wykrywania do wartości p przedziału ufności. Efekty, dla których nawet najniższa granica skorygowanego przedziału ufności jest wysoka, prawdopodobnie będą silnymi skutkami, niezależnie od ogromnego rozmiaru zbioru danych. Nie znam żadnego opublikowanego artykułu, który łączy w ten sposób przedziały ufności z fałszywą korektą wskaźnika odkryć, ale wydaje się, że jest to proste i intuicyjnie zrozumiałe podejście. Aby było to jeszcze lepsze, użyj nieparametrycznego sposobu szacowania przedziałów ufności. Zakładając, że rozkład może dać tutaj bardzo optymistyczne szacunki, a nawet dopasowanie rozkładu do danych prawdopodobnie będzie niedokładne. Ponieważ informacje o kształcie rozkładu poza krawędziami przedziału ufności pochodzą ze stosunkowo niewielkiej podpróbki danych, w tym miejscu naprawdę warto zachować ostrożność. Możesz użyć metody ładowania początkowego, aby uzyskać nieparametryczny przedział ufności.

Data Science jako socjolog?

Ponieważ bardzo interesuję się programowaniem i statystyką, Data Science wydaje mi się świetną ścieżką kariery – lubię obie dziedziny i chciałbym je połączyć. Niestety, studiowałem nauki polityczne z niestatystycznie brzmiącym mistrzem. Skupiłem się na statystykach w tym Master, odwiedzając opcjonalne kursy i pisząc pracę statystyczną na dość dużym zbiorze danych. Ponieważ prawie wszystkie stanowiska wymagają dyplomu z informatyki, fizyki lub innej dziedziny techniki, zastanawiam się, czy jest szansa, aby zostać naukowcem od danych, czy też powinienem porzucić ten pomysł.

Brakuje mi wiedzy na temat uczenia maszynowego, sql i hadoop, mając jednocześnie dość duże doświadczenie w informatyce i statystyce. Czy ktoś może mi powiedzieć, jak wykonalny jest mój cel zostania naukowcem danych?

Nauka o danych to termin, który jest używany tak samo luźno jak Big Data. Każdy ma zgrubne pojęcie, co rozumieją przez ten termin, ale jeśli spojrzysz na rzeczywiste zadania, obowiązki analityka danych będą się znacznie różnić w zależności od firmy. Analiza statystyczna mogłaby objąć całość obciążenia pracą na jednym stanowisku, a nawet nie uwzględniać innego. Nie chciałbym gonić za tytułem zawodowym jako takim. Jeśli jesteś zainteresowany tą dziedziną, połącz się w sieć (tak jak teraz) i znajdź dobre dopasowanie. Jeśli przeglądasz ogłoszenia o pracę, po prostu poszukaj tych, które podkreślają podstawy statystyki i informatyki. Hadoop i SQL są łatwe do zaznajomienia się z nimi, biorąc pod uwagę czas i motywację, ale chciałbym trzymać się obszarów, w których jesteś najsilniejszy i od tego zacząć.

Odpowiedz przez atak matematyczny Podejrzewam, że to zostanie zamknięte, ponieważ jest bardzo wąskie, ale moje 2 centy…

Data Science wymaga 3 umiejętności:

* Matematyka / statystyki

*Programowanie

* Wiedza domeny

Pokazanie wszystkich trzech może być bardzo trudne. Punkty 1 i 2 można oznaczyć stopniami, ale kierownik ds. rekrutacji, który może ich nie mieć, nie chce ufać dyplomowi sztuk wyzwolonych. Jeśli chcesz zająć się nauką o danych, najpierw zostań ekspertem domeny. Publikuj prognozy wyborcze. Jeśli masz rację, zacytuj je. Dzięki temu zostaniesz zauważony.

Jeśli posiadasz wiedzę o domenie na poziomie A+, nie potrzebujesz umiejętności programowania na poziomie A+, ale nauczysz się programowania na tyle, że nie potrzebujesz nikogo, kto będzie pobierał dane za Ciebie.

Zorientowany na naukę o danych zbiór danych / pytanie badawcze dla mgr statystyki

Praca dyplomowa

Chciałbym zbadać „naukę o danych”. Termin wydaje mi się trochę niejasny, ale spodziewam się, że będzie wymagał:

  1. uczenie maszynowe (zamiast tradycyjnych statystyk);
  2. wystarczająco duży zbiór danych, aby przeprowadzić analizy na klastrach.

Jakie są dobre zbiory danych i problemy, dostępne dla statystów z pewnym doświadczeniem programistycznym, których mogę użyć do zbadania dziedziny nauki o danych? Aby było to możliwie jak najbardziej zawężone, najlepiej byłoby, gdyby zawierały linki do otwartych, dobrze używanych zbiorów danych i przykładowych problemów.

Po prostu przejdź do kaggle.com; zapewni Ci to zajęcie przez długi czas. W przypadku otwartych danych dostępne jest repozytorium UC Irvine Machine Learning. W rzeczywistości istnieje cała witryna Stackexchange poświęcona temu;

Fundacja Sunlight to organizacja, która koncentruje się na otwieraniu i zachęcaniu do bezstronnej analizy danych rządowych. W naturze istnieje mnóstwo analiz, które można wykorzystać do porównań, oraz wiele różnych tematów. Dostarczają narzędzi i interfejsów API do uzyskiwania dostępu do danych i pomagają w udostępnianiu danych w miejscach takich jak data.gov. Ciekawym projektem jest Influence Explorer. Możesz tutaj uzyskać dane źródłowe, a także dostęp do danych w czasie rzeczywistym.

Możesz również rzucić okiem na jedno z naszych bardziej popularnych pytań: publicznie dostępne zbiory danych.

Czy masz tytuł magistra informatyki? Statystyka?

Czy „nauka o danych” będzie w centrum twojej pracy dyplomowej? Czy temat poboczny? Zakładam, że zajmujesz się statystyką i chcesz skoncentrować swoją pracę magisterską na problemie „nauki o danych”. Jeśli tak, to pójdę pod prąd i zasugeruję, aby nie rozpoczynać od zbioru danych lub metody ML. Zamiast tego powinieneś poszukać interesującego problemu badawczego  jeśli jest to słabo poznane lub gdzie metody ML nie okazały się jeszcze skuteczne, lub gdzie istnieje wiele konkurencyjnych metod ML, ale żadna nie wydaje się lepsza od innych. Rozważmy to źródło danych: zbiór danych Stanford Large Network Dataset. Chociaż możesz wybrać jeden z tych zestawów danych, utwórz opis problemu, a następnie uruchom listę  metdo ML

metody, to podejście naprawdę nie mówi zbyt wiele o tym, czym jest nauka o danych, i moim zdaniem nie prowadzi do bardzo dobrej pracy magisterskiej. Zamiast tego możesz zrobić to: poszukaj wszystkich artykułów naukowych, które używają ML w jakiejś określonej kategorii – np. Sieci współpracy (a.k.a. współautorstwo). Czytając każdy artykuł, spróbuj dowiedzieć się, co byli w stanie osiągnąć za pomocą każdej metody ML, a czego nie byli w stanie rozwiązać. Szczególnie szukaj ich sugestii dotyczących „przyszłych badań”. Może wszyscy używają tej samej metody, ale nigdy nie próbowali konkurować z metodami ML. A może nie weryfikują odpowiednio swoich wyników, a może zbiory danych są małe, a może ich pytania badawcze i hipotezy były uproszczone lub ograniczone. Najważniejsze: spróbuj dowiedzieć się, dokąd zmierza ta linia badań. Dlaczego w ogóle się tym przejmują? Co jest w tym ważnego? Gdzie i dlaczego napotykają trudności?

Najlepsze języki do obliczeń naukowych

Wydaje się, że w większości języków dostępna jest pewna liczba naukowych bibliotek obliczeniowych.

* Python ma Scipy

* Rust ma SciRust

* C ++ ma kilka, w tym ViennaCL i Armadillo

* Java ma Java Numerics i Colt, a także kilka innych

Nie wspominając o językach takich jak R i Julia, zaprojektowanych specjalnie do obliczeń naukowych. Przy tak wielu opcjach, jak wybrać najlepszy język do zadania? Dodatkowo, które języki będą najbardziej wydajne? Wydaje się, że Python i R mają największą przyczepność w przestrzeni, ale logicznie rzecz biorąc, język kompilowany wydaje się być lepszym wyborem. I czy coś kiedykolwiek przewyższy Fortran? Ponadto języki kompilowane mają zwykle akcelerację GPU, podczas gdy języki interpretowane, takie jak R i Python, nie. Co powinienem wziąć pod uwagę przy wyborze języka i które języki zapewniają najlepszą równowagę użyteczności i wydajności? Czy są też języki ze znaczącymi zasobami obliczeń naukowych, które przegapiłem?

To dość obszerne pytanie, więc nie jest to pełna odpowiedź, ale miejmy nadzieję, że może to pomóc w uzyskaniu ogólnych informacji na temat określenia najlepszego narzędzia do pracy, jeśli chodzi o naukę o danych. Generalnie mam stosunkowo krótką listę kwalifikacji, których szukam, jeśli chodzi o jakiekolwiek narzędzie w tej przestrzeni. W przypadkowej kolejności są to:

* Wydajność: Zasadniczo sprowadza się do tego, jak szybko język wykonuje mnożenie macierzy, ponieważ jest to mniej więcej najważniejsze zadanie w nauce o danych.

* Skalowalność: przynajmniej dla mnie osobiście sprowadza się to do łatwości budowania systemu rozproszonego. To jest miejsce, w którym języki takie jak Julia naprawdę świecą.

* Społeczność: w każdym języku naprawdę szukasz aktywnej społeczności, która może Ci pomóc, gdy utkniesz w używaniu dowolnego narzędzia, którego używasz. W tym miejscu Python wyprzedza większość innych języków.

* Elastyczność: nie ma nic gorszego niż ograniczenie przez język, którego używasz. Nie zdarza się to zbyt często, ale próba odwzorowania struktur grafowych w haskell jest notorycznym problemem, a Julia jest przepełniona wieloma problemami związanymi z architekturą kodu w wyniku bycia takim młodym językiem.

* Łatwość użytkowania: jeśli chcesz używać czegoś w większym środowisku, upewnij się, że konfiguracja jest prosta i może być zautomatyzowana. Nie ma nic gorszego niż konieczność skonfigurowania skomplikowanej wersji na pół tuzinie maszyn.

Jest mnóstwo artykułów na temat wydajności i skalowalności, ale generalnie będziesz się przyglądać różnicy wydajności wynoszącej może 5–10 razy między językami, co może mieć lub nie mieć znaczenia w zależności od konkretnej aplikacji. Jeśli chodzi o akcelerację GPU, cudamat jest naprawdę bezproblemowym sposobem na uruchomienie go z Pythonem, a biblioteka cuda ogólnie sprawiła, że ​​akceleracja GPU jest znacznie bardziej dostępna niż kiedyś. Dwie podstawowe miary, których używam zarówno w odniesieniu do społeczności, jak i elastyczności, to spojrzenie na platformę menedżera pakietów językowych i pytania językowe w witrynie takiej jak SO. Jeśli istnieje wiele wysokiej jakości pytań i odpowiedzi, to dobry znak, że społeczność jest aktywna. Liczba pakietów i ogólna aktywność na tych pakietach również mogą być dobrym proxy dla tej metryki. Jeśli chodzi o łatwość użycia, jestem głęboko przekonany, że jedynym sposobem, aby to wiedzieć, jest samodzielne skonfigurowanie. Istnieje wiele przesądów związanych z wieloma narzędziami do nauki o danych, w szczególności takimi jak bazy danych i rozproszona architektura obliczeniowa, ale nie ma sposobu, aby naprawdę dowiedzieć się, czy coś jest łatwe, czy trudne do skonfigurowania i wdrożenia bez samodzielnego zbudowania.

Standaryzuj liczby dla wskaźników rankingowych

Próbuję uszeregować niektóre procenty. Mam liczniki i mianowniki dla każdego stosunku. Aby podać konkretny przykład, rozważ stosunek liczby absolwentów do liczby uczniów w szkole. Problem polega jednak na tym, że całkowita liczba uczniów różni się w dużym zakresie (1000-20000). Mniejszy

Szkoły wydają się mieć większy odsetek absolwentów, ale chcę go ujednolicić i nie pozwolić, aby wielkość szkoły wpływała na ranking. Czy jest na to sposób?

Matematycznie jest to stosunkowo proste. Najpierw dopasuj linię regresji do wykresu punktowego „całkowita liczba absolwentów” (y) vs „całkowita liczba studentów” (x). Prawdopodobnie zobaczysz opadającą linię, jeśli twoje twierdzenie jest poprawne (mniejsze szkoły kończą wyższy procent). Możesz zidentyfikować nachylenie i punkt przecięcia z osią y dla tej prostej, aby przekształcić ją w równanie y = mx + b, a następnie zrób trochę algebry, aby przekształcić równanie w znormalizowaną postać: „y / x = m + b / x”

Następnie, biorąc pod uwagę wszystkie współczynniki w danych, należy odjąć tę RHS:

współczynnik znormalizowany = (suma ocen / wszystkich uczniów) – (m + b / ogółem uczniów) Jeśli wynik jest pozytywny, to stosunek jest powyżej normy dla tej wielkości (tj. powyżej linii regresji), a jeśli jest ujemny, jest poniżej linia regresji. Jeśli chcesz mieć wszystkie liczby dodatnie, możesz dodać dodatnią stałą, aby przenieść wszystkie wyniki powyżej zera. Oto jak to zrobić matematycznie, ale sugeruję, abyś zastanowił się, czy z punktu widzenia analizy danych rozsądne jest znormalizowanie według wielkości szkoły. Zależy to od celu Twojej analizy, a konkretnie od tego, jak ten współczynnik jest analizowany w odniesieniu do innych danych.

Analiza wyników testów A / B, które nie mają rozkładu normalnego, przy użyciu niezależnego testu t

Mam zestaw wyników z testu A / B (jedna grupa kontrolna, jedna grupa cech), które nie pasują do rozkładu normalnego. W rzeczywistości dystrybucja bardziej przypomina dystrybucję Landau. Uważam, że niezależny test t wymaga, aby próbki miały przynajmniej w przybliżeniu rozkład normalny, co zniechęca mnie do stosowania testu t jako ważnej metody badania istotności. Ale moje pytanie brzmi: w którym momencie można powiedzieć, że test t nie jest dobrą metodą testowania istotności? Innymi słowy, jak można określić, jak wiarygodne są wartości p testu t, biorąc pod uwagę tylko zbiór danych?

Rozkład danych nie musi być normalny, to rozkład próbkowania musi być prawie normalny. Jeśli wielkość twojej próby jest wystarczająco duża, to rozkład próbkowania średnich z Rozkładu Landaua powinien być prawie normalny, ze względu na Centralne Twierdzenie Graniczne. Oznacza to, że powinieneś być w stanie bezpiecznie używać testu t ze swoimi danymi.

Przykład

Rozważmy ten przykład: załóżmy, że mamy populację z rozkładem lognormalnym z mu = 0 i sd = 0,5 (wygląda trochę podobnie do Landaua)

Więc próbkujemy 30 obserwacji 5000 razy z tego rozkładu za każdym razem obliczając średnią z próby

Wygląda całkiem normalnie, prawda? Jeśli zwiększymy wielkość próby, będzie to jeszcze bardziej widoczne

x = seq(0, 4, 0.05)

y = dlnorm(x, mean=0, sd=0.5)

plot(x, y, type=’l’, bty=’n’)

n = 30

m = 1000

set.seed(0)

samp = rep(NA, m)

for (i in 1:m) {

samp[i] = mean(rlnorm(n, mean=0, sd=0.5))

}

hist(samp, col=’orange’, probability=T, breaks=25, main=’sample size = 30′)

x = seq(0.5, 1.5, 0.01)

lines(x, dnorm(x, mean=mean(samp), sd=sd(samp)))

n = 300

samp = rep(NA, m)

for (i in 1:m) {

samp[i] = mean(rlnorm(n, mean=0, sd=0.5))

}

hist(samp, col=’orange’, probability=T, breaks=25, main=’sample size = 300′)

x = seq(1, 1.25, 0.005)

lines(x, dnorm(x, mean=mean(samp), sd=sd(samp)))J

[38][Python]

Python jest uniwersalnym, dynamicznym, silnie typowanym językiem z wieloma bibliotekami innych firm do zastosowań związanych z nauką danych. Obecnie są w powszechnym użyciu dwie wersje: 2 i 3. Python 2 jest „starą” wersją. Żadne nowe wersje nie są wydawane poza wersją 2.7, zapisz poprawki błędów. Python 3 to „nowa” wersja z aktywnym rozwojem. Składnia języka Python jest stosunkowo łatwa do zrozumienia w porównaniu do innych języków. Na przykład:

numbers = [1, 2, 5, 8, 9]

for number in numbers:

print(“Hello world #”, numbe

Python ma czysty wygląd dzięki regulacyjnemu podejściu do białych znaków. Choć pozornie restrykcyjny, pozwala wszystkim kodom Pythona wyglądać podobnie, co sprawia, że ​​sprawdzanie kodu jest znacznie bardziej przewidywalne. Wszystkie pętle i warunki warunkowe (for, while, if itp.) Muszą być wcięte dla następnego bloku kodu. Popularne pakiety nauki i danych obejmują:

Numpy – szybka biblioteka tablic N-wymiarowych; podstawa wszystkich naukowych Python.

Scipy – Analiza numeryczna oparta na Numpy. Pozwala na optymalizację, algebrę liniową, transformaty Fouriera i wiele innych.

Pandas (PANel DAta) – Szybki i niezwykle elastyczny pakiet, który jest bardzo przydatny do eksploracji danych. Obsługuje dane NaN oraz szybkie indeksowanie. Obsługuje szeroką gamę zewnętrznych typów danych i formatów plików.

PYTANIA:

Co wziąć pod uwagę przed nauczeniem się nowego języka do analizy danych

Obecnie jestem na bardzo wczesnym etapie przygotowywania nowego projektu badawczego (wciąż na etapie wniosku o finansowanie) i oczekuję, że narzędzia do analizy danych, a zwłaszcza wizualizacji, odegrają rolę w tym projekcie. W związku z tym stoję przed następującym dylematem: czy powinienem nauczyć się języka Python, aby móc korzystać z jego obszernych bibliotek naukowych (Pandas, Numpy, Scipy,…), czy powinienem po prostu zanurzyć się w podobnych pakietach języka, który już znam (Rakieta, czy w mniejszym stopniu Scala)? (Idealnie uczyłbym się Pythona równolegle z korzystaniem z bibliotek statystycznych w Racket, ale nie jestem pewien, czy będę miał czas na jedno i drugie). Nie szukam odpowiedzi na ten dylemat, ale raczej opinii na temat moich różnych rozważań:

Moja obecna pozycja jest następująca:

Na korzyść Pythona:

– Intensywnie używane biblioteki

– Szeroko stosowany (może być decydujący w przypadku współpracy z innymi)

-Dużo materiałów online, aby rozpocząć naukę

-Konferencje, które są specjalnie poświęcone obliczeniom naukowym w języku Python

– Nauka Python i tak nie będzie stratą czasu

Na korzyść języka, który już znam:

-To sposób na pogłębienie mojej znajomości jednego języka zamiast powierzchownej znajomości jeszcze jednego języka (pod dewizą: powinieneś przynajmniej dobrze znać jeden język)

-To jest wykonalne. Zarówno rakieta, jak i Scala mają dobre biblioteki matematyczne i statystyczne

– Mogę od razu zacząć uczyć się tego, co muszę wiedzieć, niż najpierw nauczyć się podstaw

Dwa konkretne pytania:

  1. O czym zapominam?
  2. Na ile uciążliwy może być problem Python 2 vs 3?

ODPOWIEDZI:

Osobiście zamierzam tutaj mocno argumentować na korzyść Pythona. Jest wiele przyczyn tego, ale zamierzam oprzeć się na niektórych punktach, o których wspominali tutaj inni ludzie:

  1. Wybór jednego języka: zdecydowanie można mieszać i dopasowywać języki, wybierając d3 dla potrzeb wizualizacji, FORTRAN dla szybkich mnożeń macierzy i python dla całej sieci i skryptów. Możesz to zrobić wzdłuż linii, ale utrzymanie możliwie najprostszego stosu to dobry ruch, szczególnie na początku.
  2. Wybieranie czegoś większego od ciebie: nigdy nie chcesz naciskać na bariery języka, którego chcesz używać. Jest to ogromny problem, jeśli chodzi o języki takie jak Julia i FORTRAN, które po prostu nie oferują pełnej funkcjonalności języków takich jak Python lub R.
  3. Wybierz społeczność: Jedną z najtrudniejszych rzeczy do znalezienia w dowolnym języku jest społeczność. Python jest tutaj wyraźnym zwycięzcą. Jeśli utkniesz, poprosisz o coś na SO, a ktoś odpowie w ciągu kilku minut, czego po prostu nie ma w przypadku większości innych języków. Jeśli uczysz się czegoś w próżni, po prostu uczysz się dużo wolniej.

Jeśli chodzi o punkty ujemne, mogę je odepchnąć. Pogłębienie znajomości jednego języka jest dobrym pomysłem, ale znajomość tylko jednego języka bez praktyki uogólniania tej wiedzy na inne języki jest dobrym sposobem na zastrzelenie się w stopę. Zmieniłem cały mój ulubiony stos programistyczny trzy razy przez wiele lat, przechodząc z MATLAB na Javę na Haskell na Python. Nauka przenoszenia wiedzy na inny język jest o wiele bardziej cenna niż znajomość jednego. O ile to wykonalne, będzie to coś, co zobaczysz wielokrotnie w każdej karierze programistycznej. Kompletność Turinga oznacza, że ​​możesz technicznie zrobić wszystko z HTML4 i CSS3, ale chcesz wybrać odpowiednie narzędzie do pracy. Jeśli zobaczysz idealne narzędzie i zdecydujesz się je zostawić na poboczu, zwolnisz, żałując, że nie masz narzędzi, które zostawiłeś. Świetnym przykładem tego ostatniego punktu jest próba wdrożenia kodu R. Ogromnie brakuje możliwości sieciowych R w porównaniu do Pythona, a jeśli chcesz wdrożyć usługę lub użyć nieco nietypowych pakietów ścieżek, fakt, że pip ma o rząd wielkości więcej pakietów niż CRAN, jest ogromną pomocą .

Z mojego doświadczenia wynika, że ​​o platformie analizy danych należy pamiętać:

  1. Czy może obsłużyć rozmiar potrzebnych mi danych? Jeśli twoje zestawy danych mieszczą się w pamięci, zwykle nie ma większych problemów, chociaż AFAIK Python jest nieco bardziej wydajny pod względem pamięci niż R. Jeśli potrzebujesz obsługiwać zestawy danych większe niż pamięć, platforma musi sobie z tym poradzić. W takim przypadku SQL obejmuje podstawowe statystyki, Python + Apache Spark to kolejna opcja.
  2. Czy platforma pokrywa wszystkie moje potrzeby w zakresie analizy? Największą irytacją, jaką spotkałem w projektach eksploracji danych, jest konieczność żonglowania kilkoma narzędziami, ponieważ narzędzie A dobrze radzi sobie z połączeniami internetowymi, narzędzie B wykonuje statystyki, a narzędzie C wyświetla ładne zdjęcia. Chcesz, aby wybrana przez ciebie broń obejmowała jak najwięcej aspektów twoich projektów. Rozważając ten problem, Python jest bardzo obszerny, ale R ma wiele wbudowanych testów statystycznych gotowych do użycia, jeśli tego potrzebujesz.

Narzędzia i protokół do powtarzalnej analizy danych za pomocą Pythona.

Pracuję nad projektem nauki danych przy użyciu Pythona. Projekt składa się z kilku etapów. Każdy etap obejmuje pobranie zestawu danych, użycie skryptów Python, danych pomocniczych, konfiguracji i parametrów oraz utworzenie innego zestawu danych. Przechowuję kod w git, więc ta część jest objęta. Chciałbym usłyszeć o:

  1. Narzędzia do kontroli wersji danych.
  2. Narzędzia umożliwiające odtworzenie etapów i eksperymentów.
  3. Protokół i sugerowana struktura katalogów dla takiego projektu.
  4. Zautomatyzowane narzędzia do budowania / uruchamiania.

Odkąd zacząłem prowadzić badania w środowisku akademickim, ciągle szukałem satysfakcjonującego przepływu pracy. Myślę, że w końcu znalazłem coś, z czego jestem zadowolony:

1) Poddaj wszystko kontroli wersji, np. Git: W projektach badań hobby korzystam z GitHub, do badań w pracy korzystam z prywatnego GitLab serwer dostarczany przez naszą uczelnię. Tam też przechowuję moje zbiory danych.

2) Większość moich analiz wykonuję wraz z dokumentacją dotyczącą notebooków IPython. Dla mnie bardzo dobrze jest zorganizować kod, wykresy i dyskusję / wnioski w jednym dokumencie. Jeśli uruchamiam większe skrypty, zwykle umieszczam je w osobnych plikach skryptowych .py, ale nadal je wykonuję z notesu IPython poprzez magię% run, aby dodać informacje o celu, wyniku i innych parametrach. Napisałem małe rozszerzenie o komórkowej magii dla notebooków IPython i IPython, zwane „znakiem wodnym”, którego używam do wygodnego tworzenia znaczników czasu i śledzenia

Najlepszym narzędziem odtwarzalności jest rejestrowanie twoich działań, mniej więcej tak: eksperyment / wejście; spodziewany ; obserwacja / wynik; aktualna hipoteza i jeśli jest obsługiwana lub odrzucona exp1; oczekiwany 1; obs1; obsługiwana kilka fantazyjnych hipotez Można to zapisać na papierze, ale jeśli twoje eksperymenty mieszczą się w środowisku obliczeniowym, możesz użyć narzędzi obliczeniowych do częściowej lub całkowitej automatyzacji tego procesu rejestrowania (szczególnie poprzez pomoc w śledzeniu wejściowych zestawów danych, które mogą być ogromne, a dane wyjściowe). Świetnym narzędziem odtwarzalności dla Pythona o niskiej krzywej uczenia się jest oczywiście Notatnik IPython / Jupyter (nie zapomnij o% logon i% logstart magics). Innym doskonałym narzędziem, które jest bardzo aktualne (2015), jest przepis, który jest bardzo podobny do sumatry (patrz poniżej), ale został stworzony specjalnie dla Pythona. Nie wiem, czy to działa z notatnikami Jupyter, ale wiem, że autor często z nich korzysta, więc sądzę, że jeśli nie jest obecnie obsługiwany, będzie w przyszłości. Git jest także niesamowity i nie jest powiązany z Pythonem. Pomoże ci to nie tylko zachować historię wszystkich twoich eksperymentów, kodu, zestawów danych, rycin itp., Ale także zapewni ci narzędzia do utrzymywania (git kilof), współpracy (obwinianie) i debugowania (git-bisect) przy użyciu naukowych metoda debugowania (zwana debugowaniem delta). Oto historia fikcji

badacz próbuje stworzyć własny system rejestrowania eksperymentów, dopóki nie stanie się on kopią Gita. Innym ogólnym narzędziem współpracującym z dowolnym językiem (z API Pythona na pypi) jest Sumatra, która została specjalnie zaprojektowana, aby pomóc Ci w przeprowadzaniu badań powtarzalnych (powtarzalnych)

Ma na celu uzyskanie takich samych wyników, biorąc pod uwagę dokładnie ten sam kod i oprogramowanie, podczas gdy odtwarzalność ma na celu uzyskanie takich samych wyników dla dowolnego nośnika, co jest o wiele trudniejsze, czasochłonne i niemożliwe do zautomatyzowania. Oto jak działa Sumatra: dla każdego eksperymentu przeprowadzanego przez Sumatrę oprogramowanie to będzie działać jak „zapisywanie stanu gry” często występujące w grach wideo. Dokładniej, pozwoli to zaoszczędzić:

* wszystkie parametry, które podałeś;

* dokładny stan kodu źródłowego całej eksperymentalnej aplikacji i plików konfiguracyjnych;

* dane wyjściowe / wykresy / wyniki, a także każdy plik wygenerowany przez aplikację eksperymentalną.

Następnie zbuduje bazę danych ze znacznikiem czasu i innymi metadatami dla każdego eksperymentu, które można później przeszukiwać za pomocą webGUI. Ponieważ Sumatra zapisała pełny stan aplikacji dla określonego eksperymentu w jednym określonym momencie, możesz przywrócić kod, który dał określony wynik w dowolnym momencie, dzięki czemu masz powtarzalne badania przy niskim koszcie (z wyjątkiem przechowywania, jeśli pracujesz na ogromnych zestawach danych, ale możesz skonfigurować wyjątki, jeśli nie chcesz zapisywać wszystkiego za każdym razem).

W końcu możesz użyć Git lub Sumatry, zapewnią one tę samą moc powtarzalności, ale Sumatra jest specjalnie dostosowana do badań naukowych, więc zapewnia kilka fantazyjnych narzędzi, takich jak internetowy interfejs GUI, do indeksowania twoich wyników, podczas gdy Git jest bardziej dostosowany do obsługi kodu (ale ma narzędzia do debugowania, takie jak git-bisect, więc jeśli masz eksperymenty obejmujące kody, może być lepiej). Lub oczywiście możesz użyć obu! / EDIT: dsign dotknął tutaj bardzo ważnej kwestii: powtarzalność konfiguracji jest równie ważna jak replikacja aplikacji. Innymi słowy, powinieneś przynajmniej podać pełną listę używanych bibliotek i kompilatorów wraz z ich dokładnymi wersjami i szczegóły twojej platformy. Osobiście w informatyce naukowej w Pythonie odkryłem, że pakowanie aplikacji wraz z bibliotekami jest po prostu zbyt bolesne, dlatego teraz po prostu używam uniwersalnego naukowego pakietu python, takiego jak Anaconda (z doskonałym menedżerem pakietów conda), i po prostu doradzam użytkownikom korzystanie z tego samego pakietu. Innym rozwiązaniem może być dostarczenie skryptu do automatycznego generowania virtualenv lub spakowanie wszystkiego przy użyciu komercyjnej aplikacji Docker, cytowanej przez dsign lub Vagrant z open source (na przykład pylearn2-in-a-box, które używają Vagrant do stworzenia łatwo redystrybucyjnej dystrybucji pakiet środowiska wirtualnego). / EDIT2: Oto świetne wideo podsumowujące (do debugowania, ale można je również zastosować do badań), co jest fundamentem do przeprowadzenia powtarzalnych badań: rejestrowanie eksperymentów i poszczególnych etapów metody naukowej, rodzaj „jawnego eksperymentowania”.

Koniecznie sprawdź dokera! Ogólnie rzecz biorąc, wszystkie inne dobre rzeczy, które inżynieria oprogramowania tworzyła przez dziesięciolecia w celu zapewnienia izolacji i odtwarzalności. Chciałbym podkreślić, że nie wystarczy mieć powtarzalne przepływy pracy, ale także łatwe do odtworzenia przepływy pracy. Pokażę, co mam na myśli. Załóżmy, że twój projekt używa Pythona, bazy danych X i Scipy. Z pewnością będziesz używać konkretnej biblioteki do łączenia się z bazą danych z Pythona, a Scipy z kolei będzie używać rzadkich procedur algebraicznych. Jest to z pewnością bardzo prosta konfiguracja, ale nie do końca łatwa w konfiguracji, przewidziana gra słów. Jeśli ktoś chce wykonać twoje skrypty, będzie musiał zainstalować wszystkie zależności. Lub, co gorsza, mogła mieć już zainstalowane niekompatybilne wersje. Naprawienie tych rzeczy wymaga czasu. Zajmie ci to również trochę czasu, jeśli będziesz musiał przenieść swoje obliczenia do klastra, innego klastra lub niektórych serwerów w chmurze. Tutaj uznaję dokera za użyteczny. Docker to sposób na sformalizowanie i skompilowanie przepisów dla środowisk binarnych. Możesz zapisać następujące pliki w pliku dockerfile (używam tutaj zwykłego angielskiego zamiast składni Dockerfile):

* Zacznij od podstawowego środowiska binarnego, takiego jak Ubuntu

* Zainstaluj libsparse-dev

* Zainstaluj numpy i scipy

* Zainstaluj X

* Zainstaluj libX-dev

*  Zainstaluj Python-X

* Zainstaluj IPython-Notebook

* Skopiuj moje skrypty / notesy Pythona do mojego środowiska binarnego, tych plików danych i tych konfiguracji, aby wykonywać inne czynności. Aby zapewnić odtwarzalność, skopiuj je z nazwanego adresu URL zamiast pliku lokalnego.

* Może uruchomić IPython-Notebook.

Niektóre linie będą instalowały różne rzeczy w Pythonie przy użyciu pip, ponieważ pip może wykonać bardzo czystą pracę przy wyborze konkretnych wersji pakietów. Sprawdź to też! I to wszystko. Jeśli po utworzeniu pliku Dockerfile można go zbudować, może go zbudować w dowolnym miejscu, przez kogokolwiek (pod warunkiem, że mają one również dostęp do plików specyficznych dla projektu, np. Ponieważ umieścisz je w publicznym adresie URL, do którego odwołuje się plik Dockerfile). Co jest najlepsze, może przesłać powstałe środowisko (zwane „obrazem”) na publiczny lub prywatny serwer (zwany „rejestrem”), z którego mogą korzystać inne osoby. Tak więc, kiedy publikujesz swój przepływ pracy, masz zarówno w pełni powtarzalny przepis w postaci pliku Docker, jak i łatwy sposób dla ciebie lub innych osób na odtworzenie tego, co robisz:

docker run dockerregistery.thewheezylab.org/nowyouwillbelieveme

Lub jeśli chcą się bawić w twoje skrypty i tak dalej:

dockerregistery.thewheezylab.org/nowyouwillbelieveme /bin/bash

Gradient stochastyczny w oparciu o operacje wektorowe?

Załóżmy, że chcę trenować algorytm regresji spadku gradientu stochastycznego przy użyciu zestawu danych zawierającego N próbek. Ponieważ rozmiar zestawu danych jest ustalony, ponownie użyję danych T razy. Przy każdej iteracji lub „epoce” używam każdej próbki treningowej dokładnie raz po losowym uporządkowaniu całego zestawu treningowego. Moja implementacja oparta jest na Pythonie i Numpy. Dlatego przy użyciu operacji wektorowych może znacznie skrócić czas obliczeń. Wymyślenie wektorowej implementacji opadania gradientu wsadowego jest dość proste. Jednak w przypadku stochastycznego spadku gradientu nie mogę dowiedzieć się, jak uniknąć zewnętrznej pętli, która przechodzi przez wszystkie próbki w każdej epoce. Czy ktoś zna wektoryzowaną implementację stochastycznego spadku gradientu?

EDYCJA: Zostałem zapytany, dlaczego chciałbym korzystać z opadania gradientu online, jeśli rozmiar mojego zestawu danych jest stały.

Opadanie gradientu online zbiega się wolniej niż opadanie gradientu wsadowego do minimum kosztów empirycznych. Jednak zbiega się szybciej do minimum oczekiwanego kosztu, który mierzy wydajność uogólnienia. Chciałbym przetestować wpływ tych teoretycznych wyników w moim konkretnym problemie za pomocą weryfikacji krzyżowej. Bez implementacji wektoryzacyjnej mój kod zejścia gradientowego w trybie online jest znacznie wolniejszy niż kod partii z gradientowym spadkiem. To znacznie wydłuża czas potrzebny na zakończenie procesu weryfikacji krzyżowej.

Method: on-line gradient descent (regression)

Input: X (nxp matrix; each line contains a training sample, represented as a length-p vector), Y (length-n vector; Output: A (length-p+1 vector of coefficients)

Initialize coefficients (assign value 0 to all coefficients)

Calculate outputs F

prev_error = inf

error = sum((F-Y)^2)/n

it = 0

while abs(error – prev_error)>ERROR_THRESHOLD and it<=MAX_ITERATIONS:

Randomly shuffle training samples

for each training sample i:

Compute error for training sample i

Update coefficients based on the error above

prev_error = error

Calculate outputs F

error = sum((F-Y)^2)/n

it = it + 1

Po pierwsze, słowo „próbka” jest zwykle używane do opisania podgrupy populacji, więc będę odnosił się do tego samego co „przykład”. Twoja implementacja SGD jest powolna z powodu tej linii:

for each training example i:

Tutaj jawnie używasz dokładnie jednego przykładu dla każdej aktualizacji parametrów modelu. Z definicji wektoryzacja jest techniką przekształcania operacji na jednym elemencie na operacje na wektorze takich elementów. Dlatego nie możesz przetwarzać przykładów jeden po drugim i nadal używać wektoryzacji. Możesz jednak oszacować rzeczywistą wartość SGD za pomocą mini-partii. Mini-partia to niewielki podzbiór oryginalnego zestawu danych (powiedzmy 100 przykładów). Obliczasz błędy i aktualizacje parametrów na podstawie mini-partii, ale wciąż iterujesz wiele z nich bez globalnej optymalizacji, co czyni proces stochastycznym. Aby więc znacznie przyspieszyć wdrożenie, wystarczy zmienić poprzednią linię na:

batches = split dataset into mini-batches

for batch in batches:

i obliczyć błąd z partii, a nie z jednego przykładu. Choć dość oczywiste, powinienem również wspomnieć o wektoryzacji na poziomie poszczególnych przykładów. Oznacza to, że zamiast czegoś takiego:

theta = np.array([…]) # parameter vector

x = np.array([…]) # example

y = 0 # predicted response

for i in range(len(example)):

y += x[i] * theta[i]

error = (true_y – y) ** 2 # true_y – true value of response

you should definitely do something like this:

error = (true_y – sum(np.dot(x, theta))) ** 2

which, again, easy to generalize for mini-batches:

true_y = np.array([…]) # vector of response values

X = np.array([[…], […]]) # mini-batch

errors = true_y – sum(np.dot(X, theta), 1)

error = sum(e ** 2 for e in errors)

Sprawdź metodę częściowego dopasowania klasyfikatora SGD firmy scikit. Masz kontrolę nad tym, co nazywasz: możesz to zrobić „prawdziwą” nauką online, przekazując instancję na raz, lub możesz grupować instancje w mini-partie, jeśli wszystkie dane są dostępne w tablicy. Jeśli tak, możesz pokroić tablicę, aby uzyskać minibatche.

Problem optymalizacji szeregów czasowych Pandy: dodaj rok

Mam pand DataFrame zawierającą kolumnę szeregów czasowych. Lata są przesunięte w przeszłości, więc muszę dodać stałą liczbę lat do każdego elementu tej kolumny. Najlepszym sposobem, jaki znalazłem, jest iteracja wszystkich zapisów i wykorzystanie

x.replace (year = x.year + years) # x = bieżący element, lata = lata do dodania Jest cytonizowany jak poniżej, ale nadal bardzo wolny (proofing)

cdef list _addYearsToTimestamps(list elts, int years):

cdef cpdatetime x

cdef int i

for (i, x) in enumerate(elts):

try:

elts[i] = x.replace(year=x.year + years)

except Exception as e:

logError(None, “Cannot replace year of %s – leaving value as this: %s” % (str(x), repr(e)))

return elts

def fixYear(data):

data.loc[:, ‘timestamp’] = _addYearsToTimestamps(list(data.loc[:, ‘timestamp’]), REAL_YEAR-(list(data[-1:][‘return data

Jestem pewien, że istnieje sposób na zmianę roku bez iteracji, korzystając z funkcji Pandas Timestamp. Niestety nie wiem jak. Czy ktoś mógłby opracować?

Utwórz obiekt Pimed Timedelta, a następnie dodaj za pomocą operatora + =:

x = pandas.Timedelta(days=365)

mydataframe.timestampcolumn += x

Kluczem jest więc przechowywanie szeregów czasowych jako znaczników czasu. Aby to zrobić, użyj funkcji pandy to_datetime:

mydataframe[‘timestampcolumn’] = pandas.to_datetime(x[‘epoch’], unit=’s’)

zakładając, że masz znaczniki czasu jako epokowe sekundy w ramce danych x. Oczywiście nie jest to wymóg; zobacz dokumentację to_datetime, aby przekonwertować inne formaty.

Oto implementacja rozwiązania i demonstracja.

#!/usr/bin/env python3

import random

import pandas

import time

import datetime

def getRandomDates(n):

tsMin = time.mktime(time.strptime(“1980-01-01 00:00:00”, “%Y-%m-%d %H:%M:%S”))

tsMax = time.mktime(time.strptime(“2005-12-31 23:59:59”, “%Y-%m-%d %H:%M:%S”))

return pandas.Series([datetime.datetime.fromtimestamp(tsMin + random.random() * (tsMax – tsMin)) for x in def setMaxYear(tss, target):

maxYearBefore = tss.max().to_datetime().year

# timedelta cannot be given in years, so we compute the number of days to add in the next line

deltaDays = (datetime.date(target, 1, 1) – datetime.date(maxYearBefore, 1, 1)).days

return tss + pandas.Timedelta(days=deltaDays)

data = pandas.DataFrame({‘t1’: getRandomDates(1000)})

data[‘t2’] = setMaxYear(data[‘t1’], 2015)

data[‘delta’] = data[‘t2’] – data[‘t1’]

print(data)

print(“delta min: %s” % str(min(data[‘delta’])))

print(“delta max: %s” % str(max(data[‘delta’])))

Jak rozpoznać dwuczęściowy termin, gdy przestrzeń zostanie usunięta?

(„Bigdata” i „big data”)

Nie jestem facetem NLP i mam to pytanie.

Mam tekstowy zestaw danych zawierający terminy, które wyglądają jak „duże dane” i „duże dane”. Dla mnie oba są takie same. Jak mogę je wykryć w języku NLTK (Python)? Lub jakikolwiek inny moduł NLP w Pythonie?

Jest miła implementacja tego w gensim:

http://radimrehurek.com/gensim/models/phrases.html

Zasadniczo wykorzystuje podejście oparte na danych do wykrywania fraz, tj. wspólne kolokacje. Jeśli więc nakarmisz klasę fraz kilka zdań, a wyrażenie „duże dane” pojawi się bardzo często, klasa nauczy się łączyć „big data” w pojedynczy token „big_data”.

Wyodrębnianie obrazów w Pythonie

W mojej klasie muszę utworzyć aplikację przy użyciu dwóch klasyfikatorów, aby zdecydować, czy obiekt na obrazie jest przykładem phylum porifera (seasponge) czy jakiegoś innego obiektu. Jestem jednak całkowicie zagubiony, jeśli chodzi o techniki ekstrakcji funkcji w pythonie. Mój doradca przekonał mnie do korzystania ze zdjęć, które nie były omówione w klasie. Czy ktoś może skierować mnie w stronę sensownej dokumentacji lub lektury lub zasugerować metody do rozważenia?

Ten świetny samouczek obejmuje podstawy neuronowych układów splotowych, które obecnie osiągają najnowszą wydajność w większości zadań związanych z widzeniem: http://deeplearning.net/tutorial/lenet.html

Istnieje wiele opcji dla CNN w Pythonie, w tym Theano i biblioteki zbudowane na nim (uważam, że keras jest łatwy w użyciu).

Jeśli wolisz unikać głębokiego uczenia się, możesz zajrzeć do OpenCV, który może nauczyć się wielu innych rodzajów funkcji, kaskad Haar i funkcji SIFT.

Parametry Hypertuning XGBoost

XGBoost wykonał świetną robotę, jeśli chodzi o radzenie sobie zarówno z kategorycznymi, jak i ciągłymi zmiennymi zależnymi. Ale jak wybrać zoptymalizowane parametry dla problemu XGBoost?

Oto jak zastosowałem parametry do ostatniego problemu Kaggle:

param <- list( objective = “reg:linear”,

booster = “gbtree”,

eta = 0.02, # 0.06, #0.01,

max_depth = 10, #changed from default of 8

subsample = 0.5, # 0.7

colsample_bytree = 0.7, # 0.7

num_parallel_tree = 5

# alpha = 0.0001,

# lambda = 1

)

clf <- xgb.train( params = param,

data = dtrain,

nrounds = 3000, #300, #280, #125, #250, # changed from 300

verbose = 0,

early.stop.round = 100,

watchlist = watchlist,

maximize = FALSE,

feval=RMPSE

)

Wszystko, co robię, aby eksperymentować, to losowo (intuicyjnie) wybrać inny zestaw parametrów, aby poprawić wynik. Czy w ogóle automatyzuję wybór zoptymalizowanego (najlepszego) zestawu parametrów? (Odpowiedzi mogą być w dowolnym języku. Po prostu szukam techniki)

Ilekroć pracuję z xgboost, często dokonuję własnego wyszukiwania parametrów homebrew, ale możesz to zrobić za pomocą pakietu caret, takiego jak wspomniany wcześniej KrisP.

  1. Caret

Zobacz tę odpowiedź na Cross Validated, aby uzyskać dokładne wyjaśnienie, jak korzystać z pakietu Caret do wyszukiwania hiperparametrów na xgboost. Jak dostroić hiperparametry drzew xgboost?

  1. Niestandardowe wyszukiwanie w siatce

Często zaczynam od kilku założeń opartych na slajdach Owena Zhanga na temat wskazówek dotyczących analizy danych

Tutaj możesz zobaczyć, że przede wszystkim musisz dostroić próbkowanie wierszy, próbkowanie kolumn i być może maksymalną głębokość drzewa. Oto jak wykonuję niestandardowe próbkowanie wierszy i próbkowanie kolumn w poszukiwaniu problemu, nad którym obecnie pracuję:

searchGridSubCol <- expand.grid (podpróbka = c (0,5, 0,75, 1),

colsample_bytree = c (0,6, 0,8, 1))

ntrees <- 100

#Buduj obiekt xgb.DMatrix

DMMatrixTrain <- xgb.DMatrix (data = yourMatrix, label = yourTarget)

rmseErrorsHyperparameters <- zastosuj (searchGridSubCol, 1, funkcja (parameterList) {

#Extract Parametry do przetestowania

currentSubsampleRate <- parameterList [[„subsample”]]

currentColsampleRate <- parameterList [[“colsample_bytree”]]

xgboostModelCV <- xgb.cv (data = DMMatrixTrain, nrounds = ntrees, nfold = 5, showsd = TRUE,

metrics = “rmse”, verbose = TRUE, “eval_metric” = “rmse”,

„cel” = „reg: liniowy”, „maks. głębokość” = 15, „eta” = 2 / ntrees,

„subsample” = currentSubsampleRate, „colsample_bytree” = currentColsampleRate)

xvalidationScores <- as.data.frame (xgboostModelCV)

# Zapisz rmse ostatniej iteracji

rmse <- tail (xvalidationScores $ test.rmse.mean, 1)

return (c (rmse, currentSubsampleRate, currentColsampleRate))

})

W połączeniu z pewną magią ggplot2, korzystając z wyników tej funkcji zastosuj, możesz wykreślić graficzną reprezentację wyszukiwania.

Na tym wykresie jaśniejsze kolory oznaczają mniejszy błąd, a każdy blok reprezentuje unikalną kombinację próbkowania kolumn i próbkowania wierszy. Więc jeśli chcesz przeprowadzić dodatkowe wyszukiwanie powiedzmy eta (lub głębokość drzewa), skończysz z jednym z tych wykresów dla każdego testowanego parametru eta. Widzę, że masz inną metrykę oceny (RMPSE), po prostu podłącz ją do funkcji weryfikacji krzyżowej, a otrzymasz pożądany wynik. Poza tym nie martwiłbym się zbytnio dopracowaniem innych parametrów, ponieważ nie poprawi to zbytnio wydajności, a przynajmniej nie tak dużo w porównaniu do poświęcania więcej czasu na funkcje techniczne lub czyszczenie danych.

  1. Inne

Możliwe jest również wyszukiwanie losowe i wybór parametrów bayesowskich, ale jeszcze nie znalazłem ich implementacji.

Budowanie modelu uczenia maszynowego w celu przewidywania plonów na podstawie danych środowiskowych

Mam zestaw danych zawierający dane dotyczące temperatury, opadów i plonów soi dla gospodarstwa przez 10 lat (2005–2014). Na podstawie tych danych chciałbym przewidzieć rentowności w 2015 r. Należy pamiętać, że zestaw danych zawiera DZIENNE wartości temperatury i opadów, ale tylko 1 wartość rocznie dla plonu, ponieważ zbiory plonów odbywają się pod koniec sezonu wegetacyjnego zbiorów. Chcę zbudować regresję lub inny model oparty na uczeniu maszynowym, aby przewidzieć plony w 2015 r., W oparciu o regresję / jakiś inny model wyprowadzony z badania zależności między wydajnościami a temperaturą i opadami w poprzednich latach.

Znam się na uczeniu maszynowym za pomocą scikit-learn. Nie wiem jednak, jak przedstawić ten problem. Problem polega na tym, że temperatura i opady są codzienne, ale wydajność wynosi tylko 1 wartość rocznie. Jak do tego podejść?

Na początek możesz przewidzieć wydajność w nadchodzącym roku na podstawie dziennych danych z poprzedniego roku. Możesz oszacować parametry modelu, biorąc pod uwagę wartość każdego roku jako jeden „punkt”, a następnie zweryfikuj model za pomocą walidacji krzyżowej. Możesz to przedłużyć model, biorąc pod uwagę więcej niż w ubiegłym roku, ale spójrz za daleko, a będziesz mieć problemy z weryfikacją modelu i stroju.

Popraw dokładność k-średnich

Nasza broń:

Eksperymentuję z K-średnich i Hadoopem, gdzie jestem przywiązany do tych opcji z różnych powodów (np. Pomóż mi wygrać tę wojnę!).

Pole bitwy:

Mam artykuły należące do kategorii c, w których c jest naprawione. Wektoryzuję zawartość artykułów do funkcji TF-IDF. Teraz używam naiwnego algorytmu k-średnich, który zaczyna c centroidy i rozpoczyna iteracyjnie grupowanie artykułów (tj. Wiersze macierzy TF-IDF, gdzie można zobaczyć, jak to zbudowałem), aż do pojawienia się converenge.

Specjalne notatki:

  1. Początkowe centroidy: Wypróbowane losowo z każdej kategorii lub ze średniej wszystkich artykułów z każdej kategorii.
  2. Funkcja odległości: euklidesowa.

Dokładność jest niska, zgodnie z oczekiwaniami, czy mogę zrobić coś lepszego, dokonując innego wyboru dla początkowych centroidów, i / lub wybierając inną funkcję odległości?

print „Hello Data Science site!” 🙂

Sposób skonfigurowania tego eksperymentu ma dla mnie sens z punktu widzenia projektowania, ale myślę, że jest jeszcze kilka aspektów, które można jeszcze zbadać. Po pierwsze, możliwe, że nieinformacyjne funkcje odwracają uwagę twojego klasyfikatora, prowadząc do gorszych wynikówi. W analizie tekstu często mówimy o zatrzymaniu filtrowania słów, która jest po prostu procesem usuwania takiego tekstu (np., I, lub, itp.). Istnieją standardowe listy słów stop, które można łatwo znaleźć w Internecie (np. Ten), ale czasami mogą być trudne. Najlepszym rozwiązaniem jest zbudowanie tabeli powiązanej z częstotliwością funkcji w zależności od klasy, ponieważ uzyska ona funkcje specyficzne dla domeny, których prawdopodobnie nie znajdziesz w takich tabelach przeglądowych. Istnieją różne dowody na skuteczność usuwania słów zatrzymanych w literaturze, ale myślę, że te odkrycia dotyczą głównie specyficznych dla klasyfikatora (na przykład, na maszynach wektorów pomocniczych zwykle mniej wpływają nieinformacyjne cechy niż naiwne Bayes klasyfikator. Podejrzewam, że k-średnie należy do tej drugiej kategorii). Po drugie, możesz rozważyć inne podejście do modelowania obiektów niż tf-idf. Nic przeciwko tf-idf – działa dobrze w przypadku wielu problemów – ale lubię zacząć od modelowania funkcji binarnych, chyba że mam eksperymentalne dowody wskazujące, że bardziej złożone podejście prowadzi do lepszych wyników. To powiedziawszy, możliwe jest, że k-średnie mogłyby dziwnie zareagować na zmianę z przestrzeni zmiennoprzecinkowej na binarną. Jest to z pewnością łatwo sprawdzalna hipoteza! Na koniec możesz spojrzeć na oczekiwany rozkład klas w swoim zestawie danych. Czy wszystkie klasy są jednakowo prawdopodobne? Jeśli nie, możesz uzyskać lepsze wyniki albo z próbkowania, albo z innej miary odległości. Wiadomo, że k-średnich reaguje słabo w przekrzywionych sytuacjach klasowych, więc jest to również kwestia do rozważenia! Prawdopodobnie w Twojej domenie dostępne są badania opisujące, jak inni poradzili sobie z tą sytuacją.