機械学習のKNNアルゴリズム


何人かの同志の指導の下で、機械の学習の道のりを始めましたが、すべては想像したほど簡単ではありません.そのため、本文は自分の学習の道のりを記録して、このことを堅持してほしいと思っています.KNNアルゴリズムは機械学習において比較的簡単なアルゴリズムであり,理解と読解が容易である.
1.KNNの応用顧客流出予測、詐欺探知等(希少事象の分類問題により適している)
2.長所と短所-長所:これは簡単で有効なアルゴリズムであり、理解しやすく、実現しやすい.-欠点:すべてのデータセットを保存する必要があります.トレーニングセットが大きすぎると、大量のストレージスペースが消費され、各データに対して距離値を計算し、実際に使用するのに時間がかかります.
3.距離計算方式-ヨーロッパ式距離-挟み角コサイン(テキスト解析に適)-マンハッタン距離-チェビシェフ距離
4.アルゴリズムは未知のカテゴリ属性のデータセットの各点に対して以下の操作を順次実行することを実現する:(1)既知のカテゴリデータセットの点と現在の点との間の距離を計算する;(2)距離の増加順に並べ替える.(3)現在の点から最も距離の小さい点を選択する.(4)前灸のポイントがあるカテゴリの出現頻度を確定する.(5)現在のポイントの予測分類として,上位の女性ポイントの出現頻度が最も高いカテゴリを返す.
簡単な例として、Python言語でKNNアルゴリズムを実現し、データは後述する他のアルゴリズムと同じデータを使用する.
トレーニングデータ
Tid House   Marriage    Income  Borrower
1   Yes Single  125K    No
2   No  Married 100K    No
3   No  Single  70K No
4   Yes Married 120K    No
5   No  Divorced    95K Yes
6   No  Married 60K No
7   Yes Divorced    220K    No
8   No  Single  85K Yes
9   No  Married 75K No
10  No  Single  90K Yes

テストデータ
Tid House   Marriage    Income
Test    No  Married 120K

データの準備
def loadDataSet_train(path_read):
    df = pd.read_csv(path_read, sep='\t', header=0, dtype=str, na_filter=False)
    group = np.array(np.matrix(df[['House','Marriage','Income']]))
    label = np.array(np.matrix(df["Borrower"]))
    y = np.zeros(group.shape)
    y[group=='Yes']=1
    y[group=='Married']=1
    y[group=='Divorced']=2

    for i in group[:,2]:
        y[group==i]=i[0:-1]
        #print(i[0:-1])

    labels=['No', 'No', 'No', 'No', 'Yes', 'No', 'No', 'Yes', 'No', 'Yes']
    return y,labels

def loadDataSet_test(path):
    df = pd.read_csv(path, sep='\t', header=0, dtype=str, na_filter=False)
    group = np.array(np.matrix(df[['House','Marriage','Income']]))
    return group

データ分類、リファレンスマシン学習コード
def classify(inx,dataSet,label,k):
    dataSetSize = dataSet.shape[0]
    diffMat = np.tile(inx, (dataSetSize,1)) - dataSet
    sqDiffMat = diffMat ** 2
    sqDistance = sqDiffMat.sum(axis=1)
    distance = sqDistance ** 0.5
    sortedDistIndicies = distance.argsort()
    classCount={}
    for i in range(k):
        voteIlabel = label[sortedDistIndicies[i]]
        classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
    sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)
    return sortedClassCount[0][0]

異なるk値の選択は結果に大きな影響を及ぼすことが分かったが,訓練データは結局少なかった.これはただアルゴリズムを理解しやすくて、简単な実现、后でまた机械を勉强し続けて他のアルゴリズムを勉强して、コードは自分で书いてみて、これまでPython言语を使ったことがなくて、机械の勉强に対して理解がとても少なくて、大学院生の段阶だけで勉强を始めて、コードとその他の地方の及ばないところ、みんなが多く交流することを望みます.