.. blogpost:: :title: Session 3 :keywords: session 3 :date: 2019-02-22 :categories: session **Scraping** * `Scraping `_ * `Un peu plus sur le scraping `_ (`éléments de réponses `_) * `API REST `_ **Devinettes** * :ref:`l-devinette-naive-normalisation` **Texte** * :ref:`l-preprocessing` * :ref:`artificieltokenizerst` * `Analyse de sentiments `_ (`éléments de réponse `_) **Regarder les données** * `Les vélos à Chicago `_ **Un peu d'algorithme** Je reproduis ici un code qui construit les permutations d'un ensemble avec la fonction `combinaison `_ : :: def combinations(iterable, r): # combinations('ABCD', 2) --> AB AC AD BC BD CD # combinations(range(4), 3) --> 012 013 023 123 pool = tuple(iterable) n = len(pool) if r > n: return indices = list(range(r)) yield tuple(pool[i] for i in indices) while True: for i in reversed(range(r)): if indices[i] != i + n - r: break else: return indices[i] += 1 for j in range(i+1, r): indices[j] = indices[j-1] + 1 yield tuple(pool[i] for i in indices) Ensuite le code de la fonction *transform* de la classe `PolynomialFeatures `_ : :: XP = np.empty((n_samples, self.n_output_features_), dtype=X.dtype) for i, comb in enumerate(combinations): XP[:, i] = X[:, comb].prod(1) Par un pur hasard, je me suis dit qu'on pouvait faire mieux... Et donc j'ai écrit cela : :: def multiply(A, B): return numpy.multiply(A, B) XP[:, 0] = 1 pos = 1 n = X.shape[1] for d in range(0, self.poly_degree): if d == 0: XP[:, pos:pos + n] = X index = list(range(pos, pos + n)) pos += n index.append(pos) else: new_index = [] end = index[-1] for i in range(0, n): a = index[i] new_index.append(pos) new_pos = pos + end - a XP[:, pos:new_pos] = multiply(XP[:, a:end], X[:, i:i + 1]) pos = new_pos new_index.append(pos) index = new_index Et maintenant, je vous laisse trouver pour c'est plus rapide. Et pour un fois, j'ai fait l'effort de confirmer cette intuition... `Faster Polynomial Features `_. Et en fait, cette intuition était bien meilleure que celle que j'ai en me réveillant un matin, bordel... Une régression logistique est un diagramme de Voronoï... Et ce n'était pas tout-à-fait vrai `Voronoï et régression logistique `_. Mais j'avoue que j'ai pris du plaisir à explorer tout ça même si tout le monde s'en fout.