0

現在、ロジスティック回帰の実装に取り​​組んでいます。単純なデータセット (Andrew Ng の住宅購入予測) を操作するだけで、それほど複雑なことはありません。これが私がやっていることです:

私の費用関数:

def Cost(theta, X, Y):
  m = Y.size 
  h = Sigmoid(X.dot(theta.T))
  J = (1.0/m) * ((-Y.T.dot(log(h))) - ((1.0 - Y.T).dot(log(1.0-h))))
  return J.sum()

fmin の呼び出し:

initial_theta = zeros(shape = (X.shape[1],1))
theta = fmin(Cost2,initial_theta, args = (X,Y))

fmin を使用すると、最終的なシータが予測するには大きすぎます。予測するとき、私は常に 0.62 と 0.71 付近の値を取得します。これは常に true を予測します。反復回数が多ければ、より良い結果が得られるかもしれませんが、それについてはわかりません。

fmin_bfgs 使用時、NaN に収束するとコストがかかり、使用できなくなります。

他にもいくつかのデータがあります:

最終シータ:

[ 0.00126059  0.01033406]

最終的な費用:

[ 0.62079972]

予測:

[ 0.63422573  0.6727308   0.62957501  0.66757524  0.64503653  0.62245727
0.67765315  0.68966732  0.72525886  0.73487524  0.67716454  0.70974059
0.7142225   0.70415933  0.62892863  0.69232142  0.70645758  0.64152605
0.62052863  0.69538731]

実際の評価 (1 の場合、予測は >=.5 である必要があります。0 の場合、予測は <0.5 である必要があります)。これは私が受け取っていたはずのものです:

[0 0 0 1 0 0 0 0 1 1 1 1 1 1 0 1 1 1 0 1]

それを改善する方法についてのアイデアはありますか?

4

1 に答える 1

0

それで、いくつかの調査とテストの後で、私は私のコードが機能しなかった理由を見つけました。

fmin_bfgsがNaNに変換されていたので、その理由と、これを解決するために何ができるかを確認することにしました。私がしたことは最善の方法ではありませんが、問題を解決し、コードが機能するようになりました。

したがって、基本的に、fmin_bfgsは生成する数値が小さすぎるため、オーバーフローが発生し、NaNが発生していました。私がしたことは(もう一度、解決するための理想的な方法ではありませんが、それはトリックをしました):

最初:コスト関数を3つの部分に分割します。

def Cost(theta, X, Y): 
  m = Y.size
  Y = Y.flatten()
  for i in range(X.shape[0]):
  X[i]=X[i].flatten()

  h = Sigmoid(X.dot(theta.T))
  a = (-Y.T.dot(log(h)))
  b = ((1.0 - Y.T).dot(log(1.0-h)))

ご覧のとおり、コードは

J = (1.0/m) * ((-Y.T.dot(log(h))) - ((1.0 - Y.T).dot(log(1.0-h))))

は因子a、b、hに置き換えられました。ここで、hはベクトルに適用されるシグモイド関数です。いくつかのテストの結果、問題はb項にあることがわかりました。hはすべての項に対して1として計算され、log(0.0)が生成されるため、対数計算では-無限大が生成されていました。基本的な数学を知っている人にとっては、-無限大です。だから、これは私が問題を解決するためにしたことです:

if math.isnan(b):
  #case of overflow
  b = -999999

J =  (a-b)/m

return J/m 

基本的に、私が思ったのは、「ここで無限大を受け取っています。これは非常に小さい数ですが、オーバーフローを引き起こしています。したがって、オーバーフローを引き起こさない非常に小さい数に置き換えましょう!」

もう一度、おそらく最善のアプローチではありませんが、それは私にとってはトリックでした。

この後、私のコードはスムーズに実行され、実際には非常に良い結果が得られました。

于 2012-12-12T11:06:36.883 に答える