Estoy trabajando en la clasificación de texto donde tengo 39 categorías / clases y 8,5 millones de registros. (En el futuro, los datos y las categorías aumentarán).
La estructura o el formato de mis datos es el siguiente.
----------------------------------------------------------------------------------------
| product_title | Key_value_pairs | taxonomy_id |
----------------------------------------------------------------------------------------
Samsung S7 Edge | Color:black,Display Size:5.5 inch,Internal | 211
Storage:128 GB, RAM:4 GB,Primary Camera:12 MP
Case cover Honor 8 | Color:transparent,Height:15 mm,width:22 mm | 212
Ruggers Men's T-Shirt | Size:L,ideal for:men,fit:regular, | 111
sleeve:half sleeve
Optimum Nutrition Gold | Flavor:chocolate,form:powder,size:34 gm | 311
Standard Whey Protein
La distribución de datos no es normal; Está altamente desequilibrado:
-------------------------
| taxonomy_id | count |
-------------------------
111 | 851750
112 | 355592
113 | 379433
114 | 23138
115 | 117735
116 | 145757
117 | 1339471
121 | 394026
122 | 193433
123 | 78299
124 | 111962
131 | 1776
132 | 4425
133 | 908
134 | 23062
141 | 22713
142 | 42073
211 | 7892
212 | 1574744
221 | 1047
222 | 397515
223 | 53009
231 | 1227
232 | 7683
251 | 739
252 | 327
253 | 38974
254 | 25
311 | 2901
321 | 7126
412 | 856
421 | 697802
422 | 414855
423 | 17750
425 | 1240
427 | 658
429 | 1058
431 | 20760
441 | 257
Como puede ver, están altamente desequilibrados y conducen a clasificaciones erróneas.
Pasos que he realizado hasta ahora
1) Combine la columna product_title y key_value_pairs y elimine las palabras de detención y los caracteres especiales y realice la derivación.
2) He usado tubería para TFIDFvectorizer (), LinearSVC ()
vectorizerPipe = Pipeline([
('tfidf', TfidfVectorizer(lowercase=True, stop_words='english')),
('classification', OneVsRestClassifier(LinearSVC(penalty='l2', loss='hinge'))),
])
Después de esto, encajé la tubería y almacené el clasificador en pickle
prd = vectorizerPipe.fit(df.loc[:, 'description'], df.loc[:, 'taxonomy_id'])
En el lado de prueba, he repetido el paso 1 como se mencionó anteriormente y luego cargo el pepinillo y uso la función de predicción
pd = cl.predict([testData])
Problemas que estoy enfrentando
Muchos productos se clasifican erróneamente en otras categorías
Ejemplo: Ultimate Nutrition Prostar 100% Whey Protein debería clasificarse en la categoría 311, pero mi clasificador lo clasifica como 222, lo cual es completamente incorrecto.
No estoy seguro de si usar TFidfVectorizer () o Hashingvectorizer (), ¿pueden ayudarme a seleccionar uno de estos junto con sus parámetros?
Algoritmo que estoy usando es LinearSVC, ¿es una buena opción para problemas de clasificación de varias clases con gran cantidad de datos? ¿O debería usar diferentes algoritmos?
Como mis datos están altamente desequilibrados, probé un muestreo aleatorio. Los resultados fueron mejorados pero todavía no estaban a la altura. Además, no estoy seguro de si este es el enfoque correcto para realizar un muestreo aleatorio:
pipe = make_pipeline_imb( HashingVectorizer(lowercase=True), RandomUnderSampler(ratio={111: 405805, 112: 170431, 113: 241709, 114: 8341, 115: 50328, 116: 89445, 117: 650020, 121: 320803, 122: 162557, 123: 66156, 124: 36276, 131: 1196, 132: 3365, 133: 818, 134: 15001, 141: 6145, 142: 31783, 211: 24728, 212: 100000, 221: 791, 222: 8000, 223: 35406, 231: 785, 232: 3000, 251: 477, 252: 127, 253: 29563, 254: 33, 311: 2072, 321: 5370, 412: 652, 421: 520973, 422: 99171, 423: 16786, 425: 730, 427: 198, 429: 1249, 431: 13793, 441: 160},random_state=1), OneVsRestClassifier(LinearSVC(penalty='l2', loss='hinge')))
Soy nuevo en el aprendizaje automático, así que he usado este enfoque para la clasificación de texto. Si mi enfoque es incorrecto, corríjame con el correcto.
(Sería genial si da una sugerencia o solución con ejemplos, ya que me ayudará a entender mejor)
*** EDIT-1 ****
RndmFrst = RandomForestClassifier(n_estimators=100, max_depth=20, max_features=5000,n_jobs=-1)
LogReg = LogisticRegression()
voting = VotingClassifier(estimators=[('LogReg ', LogReg), ('RndmFrst', RndmFrst)], voting='soft', n_jobs=-1)
pipe = Pipeline([('tfidf', TfidfVectorizer(ngram_range=(1,4), max_features=50000)), ('clf', voting)])
pipe = pipe.fit(df.loc[:,'description'], df.loc[:,'taxonomy_id'])
Preds = pipe.predict(test_data)