質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

207閲覧

機械学習の勉強 特徴でグループ分類

shin07

総合スコア13

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/03/18 02:57

前提・実現したいこと

*勉強
機械学習にて1万ある名称を似たもの同士でグループ分け

Puthonを使って機械学習を勉強しようと考えています。
課題として挙げたのが一定の規則性のある名前1万件を
機械学習を通してグループ分けするということを考えました。

ネット上では画像の分類というのはたくさんありますが、
テキストで与えられた名前の特徴量を・・・というようなものがなく
画像よりもテキストの方が楽かと考えお題決定したつもりだったのですが・・・

どのライブラリがこの案件に適しているのか、
この内容に関して参考になるようなサイト等をご存知でしたらご教示いただけないかと
思い質問させていただきました。


名前のリスト(CSV形式)

abc-123-S-1
abc-151521-S1
acd-321-SF-1
abc-213-S-1
abc151512-S1
.
.
.
1万件

これを似たもの同士で分類するようなものです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

文字の頻度と2-gram, 3-gramくらいまでを特徴量にすれば良いでしょう。あとはグループ分けなので、クラスタリング系のアルゴリズムを使うことになります。

sklearnだけでできると思います。

sklearn.feature_extraction.text.CountVectorizer — scikit-learn 0.20.3 documentation
sklearn.feature_extraction.DictVectorizer — scikit-learn 0.20.3 documentation
sklearn.cluster.KMeans — scikit-learn 0.20.3 documentation

追記

やってみたら鼻歌交じりで五分のコーディングでした。簡単すぎるかも。

python

1import pandas as pd 2from sklearn.feature_extraction.text import CountVectorizer 3from sklearn.cluster import KMeans 4 5def main(): 6 data = ["abc-123-S-1", 7 "abc-151521-S1", 8 "acd-321-SF-1", 9 "abc-213-S-1", 10 "abc151512-S1"] 11 cv = CountVectorizer(lowercase=False, analyzer="char", 12 ngram_range=(1, 3)) 13 X = cv.fit_transform(data) 14 15 km = KMeans(n_clusters=3) 16 y = km.fit_predict(X) 17 df = pd.DataFrame({"data":data, "cluster":y}) 18 for cluster_i, x in df.groupby("cluster"): 19 print("cluster:", cluster_i) 20 print(x) 21 22if __name__ == "__main__": 23 main() 24 25""" => 26cluster: 0 27 cluster data 282 0 acd-321-SF-1 29cluster: 1 30 cluster data 311 1 abc-151521-S1 324 1 abc151512-S1 33cluster: 2 34 cluster data 350 2 abc-123-S-1 363 2 abc-213-S-1 37""" 38

今思いついた注意点ですが、データ数が1万もあるときっとそれなりに高次元の特徴量になるので、min_dfを指定して削った上でPCAとかで次元を落とさないと速度の面で実用的ではないかもしれません。あとはクラスタリング周りはいろいろ手法やパラメータ(含むクラスタ数)を試行錯誤した上で、結果が出たならその妥当性も何らかの方法で検証するべきでしょう。

投稿2019/03/18 03:06

編集2019/03/18 03:21
hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shin07

2019/03/18 23:47

参考のソースや解説のサイトまでありがとうございます。 これからやっていくという段階なのですべてを読んで理解したわけではありませんが、 これをもとに読み解き試行錯誤していこうかと思います。 丁寧な回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問