序文Python は機械学習において当然の利点を持っているので、今日から機械学習技術に取り組んでみましょう。以下は学習プロセスからのメモで、なぜこの操作が行われるのかを理解するための多くのコメントが付いています。 コードは次のように実装されます。 Numpy と Pandas と Matplotlib と Ipython #NumPy ( Numerical Python ) は、多次元配列や行列演算をサポートするPython言語の拡張ライブラリです。また、配列演算用の数学関数ライブラリも多数提供しています。 numpyをnp としてインポートする
#Pandasは、データのマージ、再形成、選択、データのクリーニング、データ処理機能など、データに対してさまざまな操作を実行できます。 pandasをpd としてインポートする
#MatplotlibはPython用のプロットライブラリです。 NumPy と連携し、 MatLab に代わる効率的なオープンソースを提供します。 matplotlib.pyplot をplt としてインポートします
#Ipython . displayライブラリは画像の表示に使用されます IPython.display からImage をインポートします sklearn.model_selection からtrain_test_split をインポートします
輸入警告 警告. filterwarnings ( 'ignore' )
データ= pd.read_csv ( "train.csv" ) 印刷( タイプ( データ)) print ( データ. 情報()) 印刷( データ. 形状) print ( データ. ヘッド()) print ( データ[[ 'MSSubClass' , 'LotArea' ]]) データセットと欠損値 #データセット内のいくつかの重要な特徴を選択する data_select = data [[ '寝室面積' , '敷地面積' , '近隣地域' , '販売価格' ]]
# データセット内のフィールドの名前を変更する data_select = data_select . rename ( columns = { 'BedroomAbvGr' : 'room' , 'LotArea' : 'area' }) 印刷( データ選択) 印刷( data_select . shape ) 印刷( "*" * 100 )
#isnull () は欠損値を決定するために一般的に使用されますが、生成されるのはすべてのデータからなる真偽行列です。 印刷( data_select . isnull ())
#df . isnull (). any () は、 どの「列」に欠損値があるかを判断します。 印刷( data_select . isnull () . any ())
#欠損値のある行と列のみを表示し、欠損値の位置を明確に識別します print ( data_select .isnull () .values == True )
#欠落データをフィルタリング data_select = data_select.dropna ( axis = 0 ) 印刷( data_select . shape ) 印刷( data_select . head ())
#print ( np . take ( data_select . columns ,[ 0 , 1 , 3 ])) #print ( type ( np . take ( data_select . columns ,[ 0 , 1 , 3 ])))
正規化 #数値が大きすぎる場合は、 正規化して、 データ分布を同じ範囲にします。 最も単純なデータ調整方法を選択し、 各数値を最大値で割ります。 col in np . take ( data_select . columns , [ 0 , 1 , - 1 ] ): # 印刷( 列) # print ( data_select [ 列] ) data_select [ 列] /= data_select [ 列] .max ()
印刷( data_select . head ())
#テストデータとトレーニングデータを配布する トレーニング、 テスト= train_test_split ( data_select . copy ()、 test_size = 0.9 ) 印刷( 列車. 形状) 印刷( テスト. 形状) 印刷( テスト. 記述())
#numpyでaxis = 0 とaxis = 1を使用する例: 印刷( "=" * 50 ) データ= np . 配列([[ 1 , 2 , 3 , 4 ],[ 5 , 6 , 7 , 8 ],[ 9 , 10 , 11 , 12 ]]) 印刷( データ) print ( data . shape ) #shape = [ 3 , 4 ] は3行4列を意味します print ( np . sum ( data )) #numpyで軸が指定されていない場合は、デフォルトですべてのデータが追加されます
print ( np . sum ( data , axis = 0 )) #axis = 0 が指定された場合、 計算は最初の次元の方向に沿って実行されます。 つまり、 列内の3つのデータが計算され、4セットの列データの計算結果が得られます。
print ( np . sum ( data , axis = 1 )) #axis = 1 が指定された場合、 計算は2次元目の方向に沿って実行されます。 つまり、 行内の4つのデータが計算され、3セットの行データ計算結果が得られます。
印刷( "=" * 50 )
#pandasでaxis = 0 とaxis = 1 を使用する例: #df.mean ( axis = 1 ) を呼び出すと、 行ごとに計算された平均が得られます。 df = pd.DataFrame (np.arange ( 12 ) .reshape ( 3,4 ) ) 印刷( df )
print ( df . mean ()) #pandasでは、axisが指定されていない場合、デフォルトの計算はaxis = 0に基づいて行われます。
print ( df . mean ( axis = 0 )) # axis = 0 が指定された場合、 最初の次元の変化方向に従って計算が実行されます。 つまり、 列内の3つのデータが計算され、4セットの列データ計算結果が得られます。
print ( df . mean ( axis = 1 )) # axis = 1 が指定された場合、 2番目の次元の変化方向に従って計算が実行されます。 つまり、 行内の4つのデータが計算され、3セットの行データ計算結果が得られます。
線形回帰モデル #h ( x ) = wx + b が線形であると仮定した線形回帰モデル。 定義線形( 特徴、 部分): print ( "pars は: " , pars ) 印刷( pars [: - 1 ]) 価格= np . sum ( 特徴* pars [: - 1 ], 軸= 1 ) + pars [ - 1 ] 返品価格
印刷( "*" * 100 ) train [ 'predict' ] = linear ( train [[ 'room' , 'area' ]]. values ,np.array ( [ 0.1 , 0.1 , 0.0 ]))
# このパラメータでは、 モデルの予測価格と実際の価格の間に大きなギャップがあることがわかります。 したがって、適切なパラメータ値を見つけることが、必要なことです。 print ( 列車. ヘッド())
#予測関数はh ( x ) = wx + b #偏差の二乗和関数: 平均二乗誤差を定義します( 予測y 、 実y ): 合計を返します( np . array ( pred_y - real_y ) ** 2 )
#損失関数: def lost_function ( df 、 features 、 pars ): df [ '予測' ] = linear ( df [ 特徴]. 値, pars ) コスト= 平均二乗誤差( df.predict 、 df.SalePrice ) / len ( df ) 返品費用
コスト= lost_function ( 列車,[ '部屋' , 'エリア' ], np . 配列([ 0.1 , 0.1 , 0.1 ])) 印刷( 費用)
#linspace 関数のプロトタイプ: linspace ( start 、 stop 、 num = 50 、 endpoint = True 、 retstep = False 、 dtype = None ) #この関数は、指定された大きな間隔内で固定間隔のデータを返します。 [ start , stop ] の間隔で等間隔に並べられた「num」個のサンプルを返します。間隔の終了点は除外できますが、デフォルトでは含まれます。 数値= 100 Xs = np . linspace ( 0 , 1 , num ) Ys = np . linspace ( 0 , 1 , num ) print ( Xs ) #if num = 5 - > [ 0. 0.25 0.5 0.75 1. ] print ( Ys ) #if num = 5 - > [ 0. 0.25 0.5 0.75 1. ]
#zeros 関数プロトタイプ: zeros ( shape , dtype = float , order = 'C' ) #機能: 通常は配列を目的の行列に変換します。 # 例: np . zeros ( ( 2 , 3 ), dtype = np . int ) Zs = np . zeros ([ num , num ]) #100 * 100 行列、すべての値は 0 です。 印刷( Zs )
#meshgridは座標ベクトルから座標行列を返します Xs , Ys = np.meshgrid ( Xs , Ys ) です。 印刷( Xs . 形状、 Ys . 形状) print ( Xs ) #num = 5 の場合、処理された行列は次のようになります。 '' ' [[ 0. 0.25 0.5 0.75 1. ] [ 0. 0.25 0.5 0.75 1. ] [ 0. 0.25 0.5 0.75 1. ] [ 0. 0.25 0.5 0.75 1. ] [ 0. 0.25 0.5 0.75 1. ]] '' ' print ( Ys ) #num = 5の場合、処理された行列は次のようになります。 '' ' [[ 0. 0. 0. 0. 0. ] [ 0.25 0.25 0.25 0.25 0.25 ] [ 0.5 0.5 0.5 0.5 0.5 ] [ 0.75 0.75 0.75 0.75 0.75 ] [ 1. 1. 1. 1. 1. ]] '' ' W1 = [] W2 = [] 費用= []
iが範囲( 100 ) 内である場合: j が範囲( 100 )の場合: W1 . 追加( 0.01 * i ) W2 . 追加( 0.01 * j ) コスト.append ( lost_function ( train ,[ 'room' , 'area' ] ,np.array ( [ 0.01 * i , 0.01 * j , 0. ]))) #numpy . argmin ( a 、 axis = None 、 out = None ) #a : 行列 #axis : 整数、オプション (選択されていない場合は配列全体が展開されます) (0 : 行、1: 列) # 小さい値の添え字を返す インデックス= np .array ( lost_function ) .argmin () print ( W1 [ インデックス], W2 [ インデックス], コスト[ インデックス])
mpl_toolkits からmplot3d をインポートしてAxes3D を作成します。 図= plt . 図() ax = fig.add_subplot ( 111 , projection = '3d' ) で、プロットの座標をプロットします。 ax.view_init ( 5 , -15 ) の ax.scatter ( W1 、 W2 、 コスト、 s = 10 ) ax.scatter ( 0.58,0.28 , zs = lost_function ( train ,[ 'room' , 'area' ] ,np.array ( [ 0.58,0.28,0.0 ] )), s = 100 , color = ' red ' ) plt . xlabel ( '部屋' ) plt . ylabel ( 'llotArea' ) plt . 表示() |