機械孊習アむリスからテレコムたで





さたざたなサヌビスを提䟛するモバむルオペレヌタヌは、膚倧な量の統蚈デヌタを蓄積したす。 私は、オペレヌタヌの操䜜䞭に1日に数癟ギガバむトの統蚈情報を生成する加入者トラフィック管理システムを実装する郚門を代衚しおいたす。 私は、これらのビッグデヌタで最倧限の有甚な情報を明らかにする方法ずいう質問に興味がありたした。 ビッグデヌタの定矩におけるVの1぀が远加の収入であるこずは、䜕もありたせん。



デヌタマむニングの専門家ではなく、この仕事を匕き受けたした。 すぐに倚くの疑問が生じたした。分析にはどのような技術的手段を䜿甚する必芁がありたすか 数孊、統蚈を知るにはどのレベルで十分ですか どの機械孊習方法を知っおおく必芁がありたすか それずも、RデヌタたたはPythonデヌタを研究するための専門的な蚀語を孊び始めたほうがよいでしょうか



私の経隓が瀺しおいるように、デヌタ調査の初期レベルではそれほど必芁ありたせん。 ただし、簡単に説明するために、デヌタを調査するための完党なアルゎリズムを明確に瀺す簡単な䟋はありたせんでした。 この蚘事では、 アむリスフィッシャヌの䟋を䜿甚しお、最初のトレヌニングを最埌たで行い、通信事業者の実際のデヌタに理解を適甚したす。 既にデヌタマむニングに粟通しおいる読者は、Telecomの章にスキップできたす。



芏玄



はじめに、研究のテヌマに取り組みたしょう。 珟圚、人工知胜、機械孊習、深局機械孊習ずいう甚語は同矩語ずしおよく䜿甚されたすが、実際には明確に定矩された階局がありたす。









この蚘事では、機械孊習に぀いお説明したす。 孊習の2぀の方法を区別したす。





教垫の堎合、これは正しい答えのデヌタがあるずきです。 次に、このデヌタセットでアルゎリズムをトレヌニングし、予枬に適甚できたす。 これらのアルゎリズムには、分類ず回垰が含たれたす。 分類ずは、䞀連の特性に埓っお特定のクラスにオブゞェクトを割り圓おるこずです。 たずえば、車の番号の認識、たたは医孊における認識、病気の蚺断、たたは銀行郚門でのクレゞットスコアリング。 回垰は、株䟡などの重芁な倉数の予枬です。



教垫自己孊習がなければ、デヌタに隠されたパタヌンを怜玢したす。 このようなアルゎリズムには、クラスタリングが含たれたす。 たずえば、すべおの䞻芁な小売チェヌンは、顧客の賌入パタヌンを探し、䞀般的な倧衆ではなく、顧客のタヌゲットグルヌプず連携しようずしたす。



回垰、分類、クラスタリングは、デヌタ調査の䞻芁なアルゎリズムであるため、それらを怜蚎したす。



デヌタマむニング



デヌタマむニングアルゎリズムは、特定の䞀連の手順で構成されおいたす。 タスクず䜿甚可胜なデヌタに応じお、䞀連のステップは異なる堎合がありたすが、䞀般的な方向は垞に決定されたす。





アルゎリズムを把握し、分析にどのツヌルを䜿甚する必芁がありたすか ExcelからMathLabなどの専甚ツヌルたで、倚数のツヌルがありたす。 Pythonを特殊なラむブラリずずもに䜿甚したす。 困難を恐れる必芁はありたせん、すべおが簡単です















むンタヌネット䞊のIPython Notebookでの自習に぀いおは、たずえば、簡単な玹介 Ipython Notebook 2.0の抂芁など、倚くの情報がありたす。



そしお、私たちは研究を始めおいたす



デヌタの収集ず粟補



Irisの䟋では、すべおのデヌタが収集され、入力されたした。 それらをロヌドしお芋るだけです



#  : import numpy as np import pandas as pd from sklearn import datasets from sklearn import linear_model from sklearn.cluster import KMeans from sklearn import cross_validation from sklearn import metrics from pandas import DataFrame %pylab inline
      
      





次



 #    : iris = datasets.load_iris() #     print iris.feature_names #   ,  10  : print iris.data[:10] #    : print iris.target_names print iris.target
      
      









デヌタセットは、2皮類のアむリスの花びらの長さ/幅で構成されおいるこずがわかりたす。がく片ず花びらです。 圌らがアむリスの出身だず聞かないでください。 タヌゲット倉数はアむリス品皮です0-Setosa、1-Versicolor、2-Virginica。 したがっお、私たちのタスクは、利甚可胜なデヌタに基づいお、花びらのサむズずアむリスの品皮ずの関係を芋぀けるこずです。



デヌタを操䜜するために、それらからDataFrameを䜜成したす。



 iris_frame = DataFrame(iris.data) #     ,   : iris_frame.columns = iris.feature_names #     : iris_frame['target'] = iris.target #      : iris_frame['name'] = iris_frame.target.apply(lambda x : iris.target_names[x]) # ,  : iris_frame
      
      





圌らが望んでいたこずを解決するように芋えた









蚘述統蚈



 #     : pyplot.figure(figsize(20, 24)) plot_number = 0 for feature_name in iris['feature_names']: for target_name in iris['target_names']: plot_number += 1 pyplot.subplot(4, 3, plot_number) pyplot.hist(iris_frame[iris_frame.name == target_name][feature_name]) pyplot.title(target_name) pyplot.xlabel('cm') pyplot.ylabel(feature_name[:-4])
      
      









このようなヒストグラムを芋るず、経隓豊富な研究者はすぐに最初の結論を導き出すこずができたす。 䞀郚の倉数の分垃が正垞であるように芋えるだけです。 もっず明確にしようずしたしょう。 Irisの皮類に応じお、笊号間の䟝存関係ずテヌブルに色を付けるテヌブルを䜜成したす。



 import seaborn as sns sns.pairplot(iris_frame[['sepal length (cm)','sepal width (cm)','petal length (cm)','petal width (cm)','name']], hue = 'name')
      
      









ここでは、経隓の浅い研究者でも、「花びらの幅cm」ず「花びらの長さcm」に匷い䟝存関係があるこずがわかりたす。同じ線に沿っお点が䌞びおいたす。 そしお、原則ずしお、同じ特性に基づいお、分類を構築するこずが可胜です。 ドットは非垞にコンパクトに色別にグルヌプ化されたす。 しかし、たずえば、倉数「sepal widthcm」および「sepal lengthcm」を䜿甚するず、定性的な分類を構築できたせん。 VersicolorずVirginicaの品皮に関連するポむントは混圚しおいたす。



倉数間の䟝存関係



次に、䟝存関係の数孊的な倀を芋おみたしょう。



 iris_frame[['sepal length (cm)','sepal width (cm)','petal length (cm)','petal width (cm)']].corr()
      
      









より芖芚的な圢で、暙識の䟝存性のヒヌトマップを䜜成したす。



 import seaborn as sns corr = iris_frame[['sepal length (cm)','sepal width (cm)','petal length (cm)','petal width (cm)']].corr() mask = np.zeros_like(corr) mask[np.triu_indices_from(mask)] = True with sns.axes_style("white"): ax = sns.heatmap(corr, mask=mask, square=True, cbar=False, annot=True, linewidths=.5
      
      









盞関係数の倀は次のように解釈されたす。





実際、倉数「花びらの長さcm」ず「花びらの幅cm」の間には、0.96ずいう非垞に匷い䟝存性が明らかになっおいたす。



サむンを遞択しお䜜成したす



最初の近䌌では、すべおの倉数をモデルに含めるだけで、䜕が起こるかを確認できたす。 その埌、削陀するサむンず䜜成するサむンを考えるこずが可胜になりたす。



トレヌニングおよびテストデヌタ



デヌタをトレヌニング甚デヌタずテストデヌタに分割したす。 通垞、サンプルは66 / 33、70 / 30、たたは80/20の割合でトレヌニングずテストに分けられたす。 デヌタに応じお、他のパヌティションが可胜です。 この䟋では、サンプル党䜓の30をテストデヌタに割り圓おたすパラメヌタヌtest_size = 0.3



 train_data, test_data, train_labels, test_labels = cross_validation.train_test_split(iris_frame[['sepal length (cm)','sepal width (cm)','petal length (cm)','petal width (cm)']], iris_frame['target'], test_size = 0.3, random_state = 0) #  ,      : print train_data print test_data print train_labels print test_labels
      
      





モデル構築サむクル-結果の評䟡



最も興味深いものに枡したす。



線圢回垰-LinearRegression



線圢回垰を芖芚化する方法は 2぀の倉数間の関係を芋るず、線から点たでの垂盎距離が党䜓的に最小になるように線を匕いおいたす。 最も䞀般的な最適化方法は、募配降䞋アルゎリズムにより暙準誀差を最小化するこずです。 募配降䞋に぀いおは、たずえば「募配降䞋ずは」セクションで説明されおいたす。 しかし、線圢回垰をオブゞェクトの分垃の方向に最も近い線を芋぀けるための抜象的なアルゎリズムずしお読んで知芚するこずはできたせん。 前に理解したように、匷い䟝存関係を持぀倉数を䜿甚しおモデルを構築したす。これらは「花匁の長さcm」ず「花匁の幅cm」です。



 from scipy import polyval, stats fit_output = stats.linregress(iris_frame[['petal length (cm)','petal width (cm)']]) slope, intercept, r_value, p_value, slope_std_error = fit_output print(slope, intercept, r_value, p_value, slope_std_error)
      
      





モデルの品質指暙を確認したす。



0.41641913228540123、-0.3665140452167277、0.96275709705096657、5.7766609884916033e-86、0.009612539319328553

最も興味深いのは、倀が0.96275709705096657のr_value倉数間の盞関係数です。 私たちはすでにそれを芋おきたしたが、ここで再びその存圚を確信しおいたす。 点ず回垰盎線でグラフを描く



 import matplotlib.pyplot as plt plt.plot(iris_frame[['petal length (cm)']], iris_frame[['petal width (cm)']],'o', label='Data') plt.plot(iris_frame[['petal length (cm)']], intercept + slope*iris_frame[['petal length (cm)']], 'r', linewidth=3, label='Linear regression line') plt.ylabel('petal width (cm)') plt.xlabel('petal length (cm)') plt.legend() plt.show()
      
      









実際、芋぀かった回垰盎線は点の分垃の方向をよく繰り返しおいるこずがわかりたす。 珟圚、たずえば五角圢のリヌフレットの長さを入手できる堎合は、幅を正確に決定できたす



分類



分類を盎感的に衚珟する方法は 2぀の特性を持぀オブゞェクトの2぀のクラスに分割する問題を芋るずたずえば、サむズがわかっおいる堎合はリンゎずバナナを分離する必芁がありたす、分類はオブゞェクトを2぀のクラスに分割する平面䞊に線を匕くこずになりたす。 より倚くのクラスに分割する必芁がある堎合は、耇数の線が描画されたす。 3぀の倉数を持぀オブゞェクトを芋るず、3次元空間ず平面の描画タスクが衚瀺されたす。 倉数がNの堎合、N次元空間の超平面を想像するだけです。



そこで、最も有名な分類蚓緎アルゎリズムである確率的募配降䞋法を採甚したす。 すでに線圢回垰で募配降䞋に遭遇しおいたすが、確率降䞋は、䜜業の速床に぀いおは、すべおのサンプルが䜿甚されるのではなく、ランダムデヌタが䜿甚されるこずを瀺しおいたす。 そしお、それをSVMサポヌトベクタヌマシン分類方法に適甚したす。



 train_data, test_data, train_labels, test_labels = cross_validation.train_test_split(iris_frame[['sepal length (cm)','sepal width (cm)','petal length (cm)','petal width (cm)']], iris_frame[['target']], test_size = 0.3, random_state = 0) model = linear_model.SGDClassifier(alpha=0.001, n_iter=100, random_state = 0) model.fit(train_data, train_labels) model_predictions = model.predict(test_data) print metrics.accuracy_score(test_labels, model_predictions) print metrics.classification_report(test_labels, model_predictions)
      
      





モデルの品質指暙を確認したす。







実際、メトリックの倀の本質を実際に理解するこずなくモデルを評䟡できたす。粟床、粟床、再珟率が0.85を超える堎合、これは良いモデルであり、0.95を超える堎合は優れたモデルになりたす。



芁するに、この䟋で䜿甚されおいるメトリックは以䞋を反映しおいたす。





これらのメトリックは、各クラスの認識品質虹圩の皮類ず合蚈倀の䞡方の芳点から䞎えられたす。 合蚈倀を確認したす。





たた、重芁なモデルメトリックPR-AUCおよびROC-AUCがありたす。たずえば、ここで芋぀けるこずができたす 機械孊習問題のメトリック 。



したがっお、この䟋のメトリック倀は非垞に優れおいるこずがわかりたす。 チャヌトを芋おみたしょう。 わかりやすくするために、サンプルを2぀の座暙で描画し、クラスごずに色付けしたす。



たず、テストサンプルをそのたた衚瀺したす。







次に、モデルが予枬したように。 境界䞊のポむント赀で囲んだ郚分が誀っお分類されおいるこずがわかりたす。







しかし同時に、ほずんどのオブゞェクトは正しく予枬されおいたす



盞互怜蚌



どういうわけか非垞に疑わしい良い結果...䜕が間違っおいるのでしょうか たずえば、誀っおデヌタをトレヌニングサンプルずテストサンプルに分割したした。 このランダム性を陀去するために、いわゆる亀差怜蚌が䜿甚されたす。 これは、デヌタがトレヌニングサンプルずテストサンプルに数回分割され、アルゎリズムの結果が平均化される堎合です。



10個のランダムサンプルでアルゎリズムの動䜜を確認したしょう。



 train_data, test_data, train_labels, test_labels = cross_validation.train_test_split(iris_frame[['sepal length (cm)','sepal width (cm)','petal length (cm)','petal width (cm)']], iris_frame['target'], test_size = 0.3) model = linear_model.SGDClassifier(alpha=0.001, n_iter=100, random_state = 0) scores = cross_validation.cross_val_score(model, train_data, train_labels, cv=10) print scores.mean()
      
      





結果を芋たす。 予想通り悪化したした 0.860909090909



最適なアルゎリズムパラメヌタヌの遞択



アルゎリズムを最適化するために他に䜕ができたすか アルゎリズム自䜓のパラメヌタヌを遞択しおみおください。 alpha = 0.001、n_iter = 100がアルゎリズムに転送されるこずがわかりたす。 それらに最適な倀を芋぀けたしょう。



 from sklearn import grid_search train_data, test_data, train_labels, test_labels = cross_validation.train_test_split(iris_frame[['sepal length (cm)','sepal width (cm)','petal length (cm)','petal width (cm)']], iris_frame['target'], test_size = 0.3) parameters_grid = { 'n_iter' : range(5,100), 'alpha' : np.linspace(0.0001, 0.001, num = 10), } classifier = linear_model.SGDClassifier(random_state = 0) cv = cross_validation.StratifiedShuffleSplit(train_labels, n_iter = 10, test_size = 0.3, random_state = 0) grid_cv = grid_search.GridSearchCV(classifier, parameters_grid, scoring = 'accuracy', cv = cv)grid_cv.fit(train_data, train_labels) print grid_cv.best_estimator_
      
      





出力では、最適なパラメヌタヌを持぀モデルを取埗したす。



SGDClassifieralpha = 0.00089999999999999998、average = False、class_weight = None、

むプシロン= 0.1、eta0 = 0.0、fit_intercept = True、l1_ratio = 0.15、

learning_rate = '最適'、loss = 'hinge'、n_iter = 96、n_jobs = 1

ペナルティ= 'l2'、power_t = 0.5、random_state = 0、shuffle = True、verbose = 0、

warm_start = False



アルファ= 0.0009、n_iter = 96であるこずがわかりたす。 モデルでこれらの倀を眮き換えたす。



 train_data, test_data, train_labels, test_labels = cross_validation.train_test_split(iris_frame[['sepal length (cm)','sepal width (cm)','petal length (cm)','petal width (cm)']], iris_frame['target'], test_size = 0.3) model = linear_model.SGDClassifier(alpha=0.0009, n_iter=96, random_state = 0) scores = cross_validation.cross_val_score(model, train_data, train_labels, cv=10) print scores.mean()
      
      





少し良くなりたした 0.915505050505



サむンを遞択しお䜜成したす



兆候を詊す時間です。 モデルからあたり重芁でない特城、぀たり「sepal lengthcm」ず「sepal widthcm」を削陀したしょう。 モデルに進みたす



 train_data, test_data, train_labels, test_labels = cross_validation.train_test_split(iris_frame[['petal length (cm)','petal width (cm)']], iris_frame['target'], test_size = 0.3) model = linear_model.SGDClassifier(alpha=0.0009, n_iter=96, random_state = 0) scores = cross_validation.cross_val_score(model, train_data, train_labels, cv=10) print scores.mean()
      
      





少し良くなりたした 0.937727272727

アプロヌチを説明するために、新しいサむンを䜜成したしょう。花びらの葉の領域ず䜕が起こるかを芋おみたしょう。



 iris_frame['petal_area'] = 0.0 for k in range(0,150): iris_frame['petal_area'][k] = iris_frame['petal length (cm)'][k] * iris_frame['petal width (cm)'][k]
      
      





モデルの代替



 train_data, test_data, train_labels, test_labels = cross_validation.train_test_split(iris_frame[['petal_area']], iris_frame['target'], test_size = 0.3) model = linear_model.SGDClassifier(alpha=0.0009, n_iter=96, random_state = 0) scores = cross_validation.cross_val_score(model, train_data, train_labels, cv=10) print scores.mean()
      
      





おもしろいですが、この䟋では、花びらの花びらの面積たたは、花びらが長方圢ではなく「幅による長さの積」であるため、面積でさえないがアむリスの倚様性を最も正確に予枬するこずがわかりたす 0.942373737374



おそらくこれは、倉数「花びらの長さcm」ず「花びらの幅cm」がアむリスをクラスに非垞にうたく分割し、その補品がクラスを線に沿っお「匕き䌞ばす」ずいう事実によっお説明できたす。







モデル最適化の䞻な方法に粟通したした。今床は、クラスタリングアルゎリズム教垫なしの機械孊習の䟋を怜蚎したす。



クラスタリング-K-means



クラスタリングの本質は非垞に簡単です-既存のオブゞェクトをグルヌプに分割しお、類䌌したオブゞェクトがグルヌプに含たれるようにする必芁がありたす。 珟圚、モデルをトレヌニングするための正しい答えがありたせん。そのため、アルゎリズム自䜓は、オブゞェクトの堎所の「近接床」に埓っおオブゞェクトをグルヌプ化する必芁がありたす。



たずえば、最も有名なK-meansアルゎリズムを考えおみたしょう。 K-meansず呌ばれるものは䜕もありたせん。 この方法は、クラスタヌのK䞭心を芋぀けるこずに基づいおいるため、クラスタヌからそれらが属するオブゞェクトたでの平均距離は最小になりたす。 最初に、アルゎリズムはK個の任意の䞭心を決定し、次にすべおのオブゞェクトがこれらの䞭心に近接しお分散されたす。 オブゞェクトのK個のクラスタヌを取埗したした。 さらに、これらのクラスタでは、オブゞェクトたでの平均距離に応じお䞭心が再蚈算され、オブゞェクトが再配垃されたす。 このアルゎリズムは、クラスタヌの䞭心が特定のデルタだけシフトしなくなるたで機胜したす。



 train_data, test_data, train_labels, test_labels = cross_validation.train_test_split(iris_frame[['sepal length (cm)','sepal width (cm)','petal length (cm)','petal width (cm)']], iris_frame[['target']], test_size = 0.3) model = KMeans(n_clusters=3) model.fit(train_data) model_predictions = model.predict(test_data) print metrics.accuracy_score(test_labels, model_predictions) print metrics.classification_report(test_labels, model_predictions)
      
      





結果を確認したす。







デフォルトのパラメヌタヌを䜿甚しおも、非垞に良奜であるこずがわかりたす。粟床、粟床、再珟率は0.9を超えおいたす。 写真で確認しおください。 適切な結果が衚瀺されたすが、垞に正確な結果ではありたせん。











アルゎリズムには欠点がありたす-その操䜜のために、怜玢するクラスタヌの数を指定する必芁がありたす。 そしお、それが䞍十分な堎合、アルゎリズムの結果は圹に立たなくなりたす。 クラスタヌの数、たずえば5を蚭定するずどうなるか芋おみたしょう。







実際には、結果は適甚されないこずがわかりたす。 最適なクラスタヌ数を決定するためのアルゎリズムが存圚したすが、この蚘事ではそれらに぀いお詳しく説明したせん。



アむリスの研究に関する結論



そこで、Irisovの䟋を䜿甚しお、機械孊習の3぀の䞻芁な方法である回垰、分類、クラスタリングを怜蚌したした。 アルゎリズムの最適化ず結果の芖芚化を実斜したした。 非垞に良い結果が埗られたしたが、これは特別に準備されたデヌタセットで期埅されおいたした。



完党なPythonノヌトブックはGithubにありたす。 Telecomに枡したす。



テレコム



Telecomには、デヌタ分析の助けを借りお、他の分野銀行、保険、小売で解決できるタスクがありたす。



さらに、特定のタスクがありたす。

通信事業者はどこで分析甚のデヌタを取埗できたすか 加入者ぞのサヌビスの提䟛に関䞎するさたざたな情報システムおよび機噚から





私の目暙は、加入者トラフィック管理システムが生成するデヌタを䜿甚しお解決できるタスクを決定するこずでした。 課金システムが加入者のトラフィックを正しく評䟡するには、誰が/どこで/い぀/どのタむプのトラフィック量を消費したかを知る必芁がありたす。 この情報は、いわゆるCDRCall Data Recordファむルの圢匏で機噚から取埗されたす。 IMSIおよびMSISDN加入者識別子、CELL ID基地局の正確な䜍眮、 IMEI加入者機噚識別子、セッションタむムスタンプ、および消費されたサヌビスに関する情報は、csv圢匏でこれらのファむルに曞き蟌たれたす。



機密性を維持するために、すべおの研究デヌタは非個人化され、圢匏に準拠したランダムな倀に眮き換えられたした。 デヌタを芋おみたしょう







このデヌタにどの機械孊習アルゎリズムを適甚できたすか たずえば、䞀定期間のサブスクラむバによるさたざたなタむプのトラフィックの消費を集蚈し、クラスタリングを実行できたす。 次のようなものが埗られるはずです。







すなわち たずえば、クラスタリングの結果、サブスクラむバヌがさたざたな方法でYouTubeを䜿甚するグルヌプ、゜ヌシャルネットワヌク、音楜を聎くグルヌプに分割されおいるこずが瀺された堎合、関心を考慮した料金を蚭定できたす。 通信事業者は、トラフィックのタむプごずに支払いを区別しお料金衚を発行するこずでこれを行っおいるず思いたす。



利甚可胜なデヌタで他に䜕を分析できたすか 加入者の機噚にはいく぀かのケヌスがありたす。 オペレヌタヌは、加入者のデバむスのモデルを知っおおり、たずえば、特定のサヌビスをSamsungナヌザヌのみに提䟛できたす。 たたは、ベヌスステヌションの座暙がわかっおいる堎合は、Samsung携垯電話の分垃のヒヌトマップを描画できたす実際の座暙はないため、 マップは珟実に関連しおいたせん。







特定の地域では、他の地域よりもパヌセンテヌゞが高くなるこずがありたす。 その埌、この情報をサムスンに提䟛しお、プロモヌションを実斜したり、スマヌトフォンの販売のためのサロンを開いたりするこずができたす。 次に、加入者がむンタヌネットにアクセスするデバむスの䞊䜍モデルを確認できたす。







珟圚の状況を隠すために、時代遅れのIMEIデヌタベヌスが採甚されたしたが、これはアプロヌチの本質を倉えたせん。 リストは、ほずんどのデバむスがApple、モデム、Samsungであり、Meizu、Micromax、Xiaomiが最埌に衚瀺されるこずを瀺しおいたす。



実際、これらはすべお、短期間で芋぀けるこずができる゜ヌスデヌタのアプリケヌションです。 もちろん、これらのデヌタによるず、さたざたな統蚈や時系列を調べたり、排出量を分析したりするこずができたすが、機械孊習を䜿甚しお䟝存関係を明らかにするために...残念ながら、私はただこれを行う方法を芋぀けおいたせん。



したがっお、テレコムのデヌタ調査に関する結論は次のずおりです。テレコムオペレヌタのタスクに察する完党な゜リュヌションには、利甚可胜なすべおの情報システムからのデヌタが必芁です。すべおのデヌタにアクセスできるだけで、モデルのコストを効果的に削枛できたす。



䞀般的な結論






All Articles