Pythonの:打ちアルゴリズム

17.11.28更新表情:このアルゴリズムは、最近のデータ前処理のpythonプロジェクトのコードに統合され、直接使用の原則を見たいと思ってしたくない、のシンプルなバージョンがあるのpython開発:プロジェクトコードテンプレート機能は
、ページCTRL + F検索打っを入力してくださいライン上で、自分自身を助けます


前のpythonを使用していない、最近それを行うにはちょうどインターネットが見つからなかった、打っを使用していますので、ほんの少しの練習の手として、パイソンと自分自身を理解する必要性を感じ、大きさが大規模なプロジェクトのいくつかの注文をしました。

私たちがバランスされていない正と負のサンプルの方法を見たときにまず、アルゴリズムの前に打っを見て、我々は通常使用します。

  • サンプリング
    従来は、オーバーサンプリングサブサンプリング、組成サンプリング含む
    サンプルのクラスより少ないサンプルが埋め込ま:オーバーサンプリング
    サブサンプリングを:圧縮されたサンプルのクラスのためのより多くのサンプル
    組成物のサンプルを:マグニチュードNに同意、同時にオーバーサンプリングをそしてサブサンプリング、陽性および陰性試料の量は、注文Nの規則に等しくなるように

データや情報のこのよう損失で、またはそれより少ないサンプル共線性、明白な欠陥につながります

  • 重量調整
    ルーチンは重量アルゴリズムを含む、重み行列は、
    右ロジスティック回帰リセットの前に、基準重量の重量比は、例えばれる昇圧反復方法の総量を変更します

このアプローチの欠点は、複数の試行を必要とする、適切な重量比の制御を超えています

  • カーネルの修正案は、
    サンプルの不均衡によって引き起こされる問題を相殺するために、カーネル関数によって変更します

この利用シナリオの制限、学習、高調整コストのカーネル関数の事前知識の高コスト、ブラックボックスの最適化

  • 更新モデル
    より少なく、従来のサンプルタイプのデータを、データの解釈には一定のルールを満たしているかどうかを、データ間の特徴を調べるために使用されるアルゴリズムは
    、例えば、線形フィットにより、サンプルクラス間の少ない直線的な関係を発見した、あなたは線形を追加することができますモデルに新しいポイントをフィッティング

実際の法則より困難見つけることは、より困難

強打(合成minorityeのオーバーサンプリング手法、強打する)、Chawla氏が2002年に提案されたアルゴリズムは、上記の問題をある程度回避することができるオーバーサンプリングされ

ここではどのようなこのアルゴリズムです:

 

正と負のサンプルの配布

明らかに、我々は青、青サンプルの数は無視の間の時間を決定するために、一般的なコール分類モデルでは、赤のサンプルよりもはるかに大きいことは赤のサンプルと失われた影響をもたらすことができることを見ることができる唯一のサンプルの分類精度を強調し、ここでは、赤のサンプルデータセットを高める必要性のバランスをとること

以下に示すように我々は、打っアルゴリズムは、n最初のいくつかのクラスの非常に単純なサンプルがランダムに選択されたあると思いました

小さなサンプルクラスの初期展開をご覧ください

以下に示すように、次に、m個のサンプルの最も近い小さなクラスを見つけます。

その後、任意の時点でM個のサンプルの必要に応じて、最も近い小さなクラス

この時点で、必要に応じて2、これは新しいデータサンプルです


R言語の開発は簡単で、リポジトリへの既製のパッケージがありますが、ここで簡単に説明します。

rm(list=ls())
install.packages(“DMwR”,dependencies=T)
library(DMwR)#加载smote包
newdata=SMOTE(formula,data,perc.over=,perc.under=)
#formula:申明自变量因变量
#perc.over:过采样次数
#perc.under:欠采样次数

コントラストの効果:

 

 

少ないクラス描いた繰り返しのようなシンプルなルックス
打っがパッケージ化され、ここでは、ライン上の直接呼び出しは、何も特別なことはありません


ここで私は、Pythonは、すべてのプロセスについて書いてました、あなた自身の手を取りたいとちょうど学習のpythonを考えました:

# -*- coding: utf-8 -*-
import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler
from numpy import *
import matplotlib.pyplot as plt
 
#读数据
data = pd.read_table('C:/Users/17031877/Desktop/supermarket_second_man_clothes_train.txt', low_memory=False)

#简单的预处理
test_date = pd.concat([data['label'], data.iloc[:, 7:10]], axis=1)
test_date = test_date.dropna(how='any')

データは以下の通り:

test_date.head()
Out[25]: 
   label  max_date_diff  max_pay  cnt_time
0      0           23.0  43068.0        15
1      0           10.0   1899.0         2
2      0          146.0   3299.0        21
3      0           30.0  31959.0        35
4      0            3.0  24165.0        98
test_date['label'][test_date['label']==0].count()/test_date['label'][test_date['label']==1].count()
Out[37]: 67

ラベルはサンプルの識別ラベルカテゴリで、0:1 = 67:1、データをラベル付けする必要性が= 1を拡大することが


# 筛选目标变量
aimed_date = test_date[test_date['label'] == 1]
# 随机筛选少类扩充中心
index = pd.DataFrame(aimed_date.index).sample(frac=0.1, random_state=1)
index.columns = ['id']
number = len(index)
# 生成array格式
aimed_date_new = aimed_date.ix[index.values.ravel(), :]

ランダム拡張のデータの中心点の数サンプルとして総量の10%を選択



# 自变量标准化
sc = StandardScaler().fit(aimed_date_new)
aimed_date_new = pd.DataFrame(sc.transform(aimed_date_new))
sc1 = StandardScaler().fit(aimed_date)
aimed_date = pd.DataFrame(sc1.transform(aimed_date))

# 定义欧式距离计算
def dist(a, b):
    a = array(a)
    b = array(b)
    d = ((a[0] - b[0]) ** 2 + (a[1] - b[1]) ** 2 + (a[2] - b[2]) ** 2 + (a[3] - b[3]) ** 2) ** 0.5
    return d

以下に、距離計算方法を定義し、除去ギャングの量を標準化する必要の距離に関連する場所でのアルゴリズムの全て、また計算速度加速
:ここで参照することにより、ユークリッド距離、より多くの距離計算を取るための方法を
距離の様々な計算やプレゼンテーションの類似性理論


# 统计所有检验距离样本个数
row_l1 = aimed_date_new.iloc[:, 0].count()
row_l2 = aimed_date.iloc[:, 0].count()
a = zeros((row_l1, row_l2))
a = pd.DataFrame(a)
# 计算距离矩阵
for i in range(row_l1):
    for j in range(row_l2):
        d = dist(aimed_date_new.iloc[i, :], aimed_date.iloc[j, :])
        a.ix[i, j] = d
b = a.T.apply(lambda x: x.min())

距離行列を形成し、上記距離を算出する関数を呼び出します


# 找到同类点位置
h = []
z = []
for i in range(number):
    for j in range(len(a.iloc[i, :])):
        ai = a.iloc[i, j]
        bi = b[i]
        if ai == bi:
            h.append(i)
            z.append(j)
        else:
            continue
new_point = [0, 0, 0, 0]
new_point = pd.DataFrame(new_point)
for i in range(len(h)):
    index_a = z[i]
    new = aimed_date.iloc[index_a, :]
    new_point = pd.concat([new, new_point], axis=1)

new_point = new_point.iloc[:, range(len(new_point.columns) - 1)]

場所を見つける場合には、ロケーションに基づいて、特定のデータを見つけるために、元のデータセットにアクセスしてください


import random
r1 = []
for i in range(len(new_point.columns)):
    r1.append(random.uniform(0, 1))
new_point_last = []
new_point_last = pd.DataFrame(new_point_last)
# 求新点 new_x=old_x+rand()*(append_x-old_x)
for i in range(len(new_point.columns)):
    new_x = (new_point.iloc[1:4, i] - aimed_date_new.iloc[number - 1 - i, 1:4]) * r1[i] + aimed_date_new.iloc[
                                                                                          number - 1 - i, 1:4]
    new_point_last = pd.concat([new_point_last, new_x], axis=1)
print new_point_last

最後に、式に従って打っnew_x=old_x+rand()*(append_x-old_x)新に計算されたポイントを、Pythonはこの練習の手を締結します

実際には、この結果に、我々は包括的なTomekリンク統合データ伸張アルゴリズムのアイデアを行うことができます以下の通りである。
我々は新しいデータポイント2つの青色のボックスを生成するために、上記のアルゴリズムを使用するとします。


我们认为,对于新产生的青色数据点与其他非青色样本点距离最近的点,构成一对Tomek link,如下图框中的青蓝两点

 

 


我们可以定义规则:
当以新产生点为中心,Tomek link的距离为范围半径,去框定一个空间,空间内的少数类的个数/多数类的个数<最低阀值的时候,认为新产生点为“垃圾点”,应该剔除或者再次进行smote训练;空间内的少数类的个数/多数类的个数>=最低阀值的时候,在进行保留并纳入smote训练的初始少类样本集合中去抽样
所以,剔除左侧的青色新增点,只保留右边的新增数据如下:

 


欢迎大家关注我的个人bolg,更多代码内容欢迎follow我的个人Github,如果有任何算法、代码疑问都欢迎通过公众号发消息给我哦。

少年,扫一下嘛

 

参考文献:



作者:slade_sal
链接:https://www.jianshu.com/p/ecbc924860af
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

おすすめ

転載: blog.csdn.net/huobanjishijian/article/details/85245030