Advertisement
Guest User

Untitled

a guest
Apr 20th, 2018
1,524
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.50 KB | None | 0 0
  1. coding=utf-8
  2. import pandas
  3. import numpy as np
  4. from sklearn import datasets, grid_search
  5. from sklearn.svm import SVC
  6. from sklearn.feature_extraction.text import TfidfVectorizer
  7. from sklearn.cross_validation import KFold
  8.  
  9. import sys
  10. sys.path.append("..")
  11. from shad_util import print_answer
  12.  
  13. # 1. Загрузите объекты из новостного датасета 20 newsgroups, относящиеся к категориям "космос" и
  14. # "атеизм" (инструкция приведена выше). Обратите внимание, что загрузка данных может занять несколько минут
  15.  
  16. newsgroups = datasets.fetch_20newsgroups(subset='all', categories=['alt.atheism', 'sci.space'])
  17. X = newsgroups.data
  18. y = newsgroups.target
  19.  
  20. # 2. Вычислите TF-IDF-признаки для всех текстов. Обратите внимание, что в этом задании мы предлагаем вам
  21. # вычислить TF-IDF по всем данным. При таком подходе получается, что признаки на обучающем множестве используют
  22. # информацию из тестовой выборки — но такая ситуация вполне законна, поскольку мы не используем значения целевой
  23. # переменной из теста. На практике нередко встречаются ситуации, когда признаки объектов тестовой выборки известны на
  24. # момент обучения, и поэтому можно ими пользоваться при обучении алгоритма.
  25.  
  26. vectorizer = TfidfVectorizer()
  27. vectorizer.fit_transform(X)
  28.  
  29. # 3. Подберите минимальный лучший параметр C из множества [10^-5, 10^-4, ... 10^4, 10^5] для SVM с
  30. # линейным ядром (kernel='linear') при помощи кросс-валидации по 5 блокам. Укажите параметр random_state=241 и для SVM,
  31. # и для KFold. В качестве меры качества используйте долю верных ответов (accuracy).
  32.  
  33. grid = {'C': np.power(10.0, np.arange(-5, 6))}
  34. cv = KFold(y.size, n_folds=5, shuffle=True, random_state=241)
  35. model = SVC(kernel='linear', random_state=241)
  36. gs = grid_search.GridSearchCV(model, grid, scoring='accuracy', cv=cv)
  37. gs.fit(vectorizer.transform(X), y)
  38.  
  39. score = 0
  40. C = 0
  41. for attempt in gs.grid_scores_:
  42.     if attempt.mean_validation_score > score:
  43.         score = attempt.mean_validation_score
  44.         C = attempt.parameters['C']
  45.  
  46. # 4. Обучите SVM по всей выборке с оптимальным параметром C, найденным на предыдущем шаге.
  47.  
  48. model = SVC(kernel='linear', random_state=241, C=C)
  49. model.fit(vectorizer.transform(X), y)
  50.  
  51. # 5. Найдите 10 слов с наибольшим по модулю весом. Они являются ответом на это задание. Укажите их через запятую или
  52. # пробел, в нижнем регистре, в лексикографическом порядке.
  53.  
  54. words = vectorizer.get_feature_names()
  55. coef = pandas.DataFrame(model.coef_.data, model.coef_.indices)
  56. top_words = coef[0].map(lambda w: abs(w)).sort_values(ascending=False).head(10).index.map(lambda i: words[i])
  57. top_words.sort()
  58. print_answer(1, ','.join(top_words))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement