WebHU - Programozási kérdések és válaszok

problémák két különböző SVM megközelítés ábrázolásakor a matplotlib segítségével?

Az osztályozási algoritmus két különböző megközelítését szeretném összekeverni, mint ez a dokumentációs példa. Ezt próbáltam:

from sklearn.feature_extraction.text import TfidfVectorizer
import numpy as np
tfidf_vect= TfidfVectorizer(use_idf=True, smooth_idf=True, sublinear_tf=False, ngram_range=(2,2))

import pandas as pd
df = pd.read_csv('/data.csv',
                     header=0, sep=',', names=['SentenceId', 'Sentence', 'Sentiment'])



X = tfidf_vect.fit_transform(df['Sentence'].values)
y = df['Sentiment'].values


from sklearn import cross_validation
X_train, X_test, y_train, y_test = cross_validation.train_test_split(X,
                                                    y, test_size=0.33)
from sklearn.svm import SVC
#first svm
clf = SVC(kernel='linear')
clf.fit(reduced_data, y)
prediction = clf.predict(X_test)
w = clf.coef_[0]
a = -w[0] / w[1]
xx = np.linspace(-10, 10)
yy = a * xx - clf.intercept_[0] / w[1]


# get the separating hyperplane using weighted classes

#second svm
wclf = SVC(kernel='linear', class_weight={5: 10},C=1000)
wclf.fit(reduced_data, y)
weighted_prediction = wclf.predict(X_test)



#PCA
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
pca.fit(X)


ww = wclf.coef_[0]
wa = -ww[0] / ww[1]
wyy = wa * xx - wclf.intercept_[0] / ww[1]

# plot separating hyperplanes and samples
import matplotlib.pyplot as plt
h0 = plt.plot(xx, yy, 'k-', label='no weights')
h1 = plt.plot(xx, wyy, 'k--', label='with weights')
plt.scatter(reduced_data[:, 0], reduced_data[:, 1], c=y, cmap=plt.cm.Paired)
plt.legend()

plt.axis('tight')
plt.show()

De a következő kivételt kapom:

Traceback (most recent call last):
  File "file.py", line 25, in <module>
    a = -w[0] / w[1]
  File "/usr/local/lib/python2.7/site-packages/scipy/sparse/csr.py", line 253, in __getitem__
    return self._get_row_slice(row, col)
  File "/usr/local/lib/python2.7/site-packages/scipy/sparse/csr.py", line 320, in _get_row_slice
    raise IndexError('index (%d) out of range' % i)
IndexError: index (1) out of range

Hogyan ábrázolhatom helyesen ezt a feladatot 2-D vagy 3D-ben a matplotlib segítségével?. Ezt is próbáltam, de egyértelműen ez rossz:

adja meg itt a kép leírását

Előre is köszönöm, ezek az adatok, amelyeket ehhez használok.

Amikor nyomtatok w, ez történik:

     (0, 911)   -0.352103548716
    a = -w[0] / w[1]
  (0, 2346) -1.20396753467
  File "/usr/local/lib/python2.7/site-packages/scipy/sparse/csr.py", line 253, in __getitem__
  (0, 2482) -0.352103548716
  (0, 2288) -0.733605938797
  (0, 1175) -0.868966214318
  (0, 1936) -0.500071158622
  (0, 2558) -0.40965370142
  (0, 788)  -0.485330735934
  (0, 322)  -0.575610464517
  (0, 453)  -0.584854414882
  (0, 1913) -0.300076915818
  (0, 2411) -0.419065159403
  (0, 2017) -0.407926583824
  (0, 2363) -0.407926583824
  (0, 815)  -1.09245625795
  (0, 543)  -0.248207856236
  (0, 1082) -0.366433457602
  (0, 1312) -0.286768829333
  (0, 1525) -0.286768829333
  (0, 1677) -0.286768829333
  (0, 2679) -0.688619491265
  (0, 413)  -0.101096807406
  (0, 1322) -0.13561265293
  (0, 1488) -0.120403497624
  (0, 1901) -0.337806267742
  : :
  (0, 1609) 0.100116485705
  (0, 581)  0.276579777388
  (0, 2205) 0.241642287418
  (0, 1055) 0.0166785719624
  (0, 2390) 0.349485515339
  (0, 1866) 0.357035248059
  (0, 2098) 0.296454010725
  (0, 2391) 0.45905660273
  (0, 2601) 0.357035248059
  (0, 619)  0.350880030278
  (0, 129)  0.287439419266
  (0, 280)  0.432180530894
  (0, 1747) -0.172314049543
  (0, 1211) 0.573579514463
  (0, 86)   0.3152907757
  (0, 452)  0.305881204557
  (0, 513)  0.212678772368
  (0, 946)  -0.347372778859
  (0, 1194) 0.298193025133
  (0, 2039) 0.34451957335
  (0, 2483) 0.245366213834
  (0, 317)  0.355996551812
  (0, 977)  0.355996551812
  (0, 1151) 0.284383826645
  (0, 2110) 0.120512273328

Nagyon nagy, ritka mátrixot adott vissza.


  • Talán ez a probléma magasabb dimenzióban él. Kell-e PCA-t készítenem a tervrajzhoz? 25.02.2015
  • Meg tudod adni a pastebin linkben használt adatokat? 25.02.2015
  • Megszerkesztettem @Ffisegydd, köszönöm a segítséget! 26.02.2015
  • @Ffisegydd Íme a mátrixok alakjai: redukált_adat.alak, y.alak, X_teszt.alak, X_train.shape rendre így néznek ki: (2599, 11991) (2599,) (858, 11991) (1741, 11991) 26.02.2015
  • Vissza tudod tenni az adatokat? 10.03.2015
  • @Alex frissítem az adatokat. Köszönöm a segítséget! 10.03.2015

Válaszok:


1
w = clf.coef_[0]
a = -w[0] / w[1]

Úgy tűnik, hogy a "w" listája csak egy értéket tartalmaz. Ez lehet az oka annak, hogy hibaüzenetet kap, amikor megpróbál hozzáférni a második w[1] indexhez.

25.02.2015
  • Van ötleted, hogyan lehetne ezt orvosolni? Köszönöm a visszajelzést. szerkesztettem 26.02.2015
  • print w, és nézze meg, milyen értéket tárol a rendszer. Ahhoz, hogy a jelenlegi a = -w[0] / w[1] ne hibásodjon, hasonlítania kell a [number, number]-ra. 26.02.2015
  • Nem tudtam kinyomtatni a w alakját, ezt próbáltam kinyomtatni:reduced_data.shape, y.shape, X_test.shape, X_train.shape így néznek ki: (2599, 11991) (2599,) (858, 11991) (1741, 11991) 26.02.2015
  • Képesnek kell lennie w = clf.coef_[0] print w a = -w[0] / w[1] megmutatni, hogy mi van a "w"-ben tárolva, mielőtt a következő sorban hibázik. Az adatoknak kell két értéket felosztani a a = -w[0] / w[1] sor szerint. Ha a fenti (2599,) második értéket használja, hiba lép fel. Ellenőrizném az értékeket, mielőtt megpróbálnám a matematikát. 26.02.2015
  • Bocsánat, hogy összezavarodtam, melyik sorban volt a hiba, szerkesztettem a kérdést. Amikor w nyomtattam, nagyon nagy ritka mátrixot adott vissza 26.02.2015

  • 2

    Ha w egy ritka mátrix, akkor hozzá kell férnie, mint olyan. Próbáld ki:

    a = -w[0,0] / w[0, 1]
    

    Bár figyelmeztetnem kell: az általad követett vizualizációs példa egy nagyon egyszerű 2D-s probléma. Ahhoz, hogy az elképzelt vizualizációnak bármi értelme is legyen, a probléma vizualizálása előtt dimenziócsökkentést kell végrehajtania (például PCA). Bár nyilvánvalóan meg tudja rajzolni a 12k-os dimenziók első 2 koordinátáját, gyakorlatilag 0 az esélye, hogy ezek a leginformatívabb méretek.

    SZERKESZTÉS: a w mátrixot nézve ez továbbra sem fog működni, de legalább most nullával osztást kellene adnia, nem pedig egy tartományon kívüli indexet. Kicsit jobban belegondolva nem vagyok egészen biztos benne, hogyan oldjam meg a problémáját. Ha célja az adatok megjelenítése, akkor a PCA segítségével először 2D-re redukálhatja az adatokat, majd futtathat egy SVM-et, hogy megtalálja az elválasztót (súlyozással és anélkül), de nem valószínű, hogy az SVM paraméterei általánosítanak a tényleges adatokra. probléma. Másrészt az SVM-et magasabb dimenzióban is futtathatja, és ezzel színezheti a megoldást a PCA-ban. A legjobb esetben ez két meglehetősen jól elkülönülő színes csoportot ad: ebben az esetben az SVM nagyon jól működik, és a PCA fenntartja a probléma szerkezetének nagy részét. Ha azonban a két feltétel egyike nem teljesül (és különösen az utóbbi valószínűleg nem teljesül a legtöbb probléma esetén), akkor szinte véletlenszerű mintát kap a színeiben. Ebben az esetben egyáltalán nem lehet következtetéseket levonni.

    2. SZERKESZTÉS: Írtam egy rövid szkriptet 2 PCA-dimenzió kinyeréséhez és ábrázolásához. Megjegyzendő, hogy nem csökkentem 2-re, hanem 10000-re, majd kivonom az első 2-t. A gyakorlatban ez nem jelent nagy különbséget (a kódom kevésbé hatékony), de így lehetővé teszi, hogy szemléltessem egy pont: ha 10 000 dimenzióra csökkented, nem veszíted el a reprezentatív teljesítményt, vagyis körülbelül 2k haszontalan méreted van (vagy több, nem próbáltad tovább csökkenteni a PCA-t). A 2-re való csökkentés azonban túl messzire megy: akkor marad a 0,07-es hatvány, ami túl alacsony ahhoz, hogy bármi hasznosat is csináljunk vele. Ahogy a cselekményben is látod. Ne feledje, hogy ha valami heves nagyítást tesz a rajzon, úgy tűnik, hogy lineáris korreláció van a PCA-csökkentés első két összetevője között. Sajnos nem vagyok elég jó statisztikus ahhoz, hogy megmondjam, mit jelent ez. Ha tippelnem kellene, azt mondanám, hogy elég kis kovariancia van az adataidban, de ez egy totális szúrás.

    from sklearn.feature_extraction.text import TfidfVectorizer
    import numpy as np
    tfidf_vect= TfidfVectorizer(use_idf=True, smooth_idf=True, sublinear_tf=False, ngram_range=(2,2))
    
    import pandas as pd
    df = pd.read_csv('corpus.txt',
                         header=0, sep=',', names=['SentenceId', 'Sentence', 'Sentiment'])
    
    
    
    X = tfidf_vect.fit_transform(df['Sentence'].values)
    y = df['Sentiment'].values
    
    
    from sklearn.decomposition import PCA
    pca = PCA(n_components=10000)
    reduced = pca.fit_transform(X.toarray())
    print sum(pca.explained_variance_ratio_)
    print pca.explained_variance_ratio_[0] + pca.explained_variance_ratio_[1]
    
    from matplotlib import pyplot as plt
    
    by_class = {}
    for i in range(0, len(y)):
      if not y[i] in by_class:
        by_class[y[i]] = []
      by_class[y[i]].append(reduced[i])
    
    for c in by_class:
      toplt = np.array(by_class[c]).T
      plt.plot(toplt[0], toplt[1], linestyle='', marker='o')
    
    plt.show()
    

    A fenti kód által generált telek

    09.03.2015
  • Köszönjük a visszajelzést @Acrofales. Ezt kaptam a megoldásoddal:Traceback (most recent call last): File "l.py", line 26, in <module> yy = a * xx - clf.intercept_[0] / w[1] File "/usr/local/lib/python2.7/site-packages/scipy/sparse/csr.py", line 253, in __getitem__ return self._get_row_slice(row, col) File "/usr/local/lib/python2.7/site-packages/scipy/sparse/csr.py", line 320, in _get_row_slice raise IndexError('index (%d) out of range' % i) IndexError: index (1) out of range 10.03.2015
  • Próbáltam pca-val is, de az svm teljesítménye rossz volt (azaz minden mérőszám leesik) 10.03.2015
  • Ez a PCA: from sklearn.decomposition import PCA pca = PCA(n_components=2) pca.fit(X) innen van valami ötleted, hogyan kell ábrázolni? 10.03.2015
  • Az új verzióban ki tudná nyomtatni w-t és a w alakját is? Azt hiszem, a w valószínűleg még mindig ritka mátrix, és a w[0, 1]-vel kell elérni. Ami a PCA utáni SVM-et illeti: várhatóan az SVM rosszul fog teljesíteni az erősen csökkentett adatokon. Nem valószínű, hogy 11 000 dimenziót 2-re csökkenthet anélkül, hogy jelentős információveszteséget és szétválaszthatóságot okozna. De a célja az adatok vizualizálása, igaz? Egyszerűen fogadja el, hogy az SVM nem fog olyan jól működni, de Ön képes lesz az (esetleg értelmetlen) adatait ábrázolni. Mekkora a PCA teljesítménye (az első 2 sajátérték összege)? 10.03.2015
  • Köszönöm a segítséget @Acrofales. Módosítottam a kérdést és frissítettem a w. Még mindig nem tudom kitalálni, hogyan kell ezt ábrázolni. Hogyan számíthatom ki a sajátértékek teljesítményét? 11.03.2015
  • @ml_guy: A w akkor még ritka mátrix, és annak ellenére, hogy oszlopvektor, mátrixként kell hozzáférned: w[0, 1], hogy a 2. elemet megkapd a vektorodban. A redukció teljesítménye megegyezik az Ön által használt sajátvektoroknak megfelelő sajátértékek összegével. Tehát, ha 2 dimenzióra redukál, a teljesítmény az első 2 sajátérték összege. Ha a sklearnt használja a PCA elvégzéséhez, ezek az értékek a explained_variance_ratio_ mappában tárolódnak. 11.03.2015
  • pff... Elakadtam Valószínűleg ezt a feladatot nem lehet kirajzolni. @Acrofales, köszönöm a segítséget! 15.03.2015
  • Köszönöm a jutalmat, de ez nem igazán érdemelte meg. Kicsit hasznosabb dolgokat szerkesztek. Pontosabban a PCA ábrázolásának kódja. Megjegyzendő azonban, hogy a PCA 2 dimenzióra való redukálása teljesen értelmetlen: az eredeti válaszhoz viszonyított reprezentatív teljesítmény 0,07 (ami azt jelenti, hogy az eredeti tér varianciájának ~7%-a e két dimenzió eltérésével magyarázható) . Általánosságban egyetértek a végső következtetéseddel: bár nem lehetetlen felvázolni, nem segít jobban megérteni a problémát. Mit akartál kitalálni a cselekményeddel? 17.03.2015
  • Szeretném felvázolni, hogyan viselkedik a hipersík, mint a példa a dokumentációban. Köszönet a támogatásért 17.03.2015
  • Igen, de a vizualizáció ebben a magasabb dimenzióban valószínûleg nem a legjobb megközelítés. Mit próbálsz megérteni a megoldásoddal vagy problémáddal kapcsolatban azzal, hogy ábrázolod, hogyan viselkedik a hipersík? Hrm. Mostanra valószínűleg a stats.stackexchange.com tartalmához nyúlunk. Talán a legjobb, ha átgondolod ezt a kérdést, és felteszed oda. 17.03.2015
  • Csak gyakorlatként szeretném látni (alsós diák vagyok), hogy hogyan néz ki ez a probléma, és hogyan osztályoznak a hipersíkok bármilyen más ötletet, hogyan tudom ezt elképzelni?. 17.03.2015
  • Őszintén szólva, ha megpróbálja megérteni az SVM (vagy bármely más ML algoritmus) működését a vizualizálással, akkor a legjobb, ha ragaszkodik a 2D vagy 3D problémákhoz. Ez megadja az algoritmus alapvető érzéseit, és segít megérteni az általa használt költségfüggvényt. Miután megértette, hogy jobban megértheti ezt a költségfüggvényt magasabb dimenziókban, és közvetlenül használhatja (valamint más mérőszámok egész skáláját) annak értékelésére, hogy a módszer mennyire működik a nagydimenziós problémán. Fontos Önnek ez a konkrét adatkészlet? 17.03.2015
  • Köszönöm a támogatást, amióta ezekkel az adatokkal dolgozom. 18.03.2015
  • Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..