2017-07-25 1 views
0

で認識されていない機能が正常に動作して素敵なPMML出力を作成し、ライブラリRのPMML成功への機能が、ここではコンテナ

library(pmml) 
library(pmmlTransformations) 
data(iris) 
irisBox <- WrapData(iris) 
irisBox <- FunctionXform(irisBox,origFieldName="Sepal.Length", 
      newFieldName="Sepal.Length.Transformed", 
      formulaText="ifelse(Sepal.Length>5,Sepal.Length*1.2, Sepal.Length*.8)") 
mod1 <- lm(Sepal.Length.Transformed ~ Petal.Length, irisBox$data) 
pmml(mod1, transform = irisBox) 

のカップルを使用したRスクリプトの例です。しかし、ifelse文はpmml 4_3の認識可能な関数ではありません。誰もがpmmlの実行可能なコマンドを生成する上記のスクリプトの代わりにお勧めですか?

私はDiscretizeXformがpmmlTransformationsパッケージで推奨されていることを認識し、それは非常に面倒ですので、それは外部のファイルからブレークポイントを読み取ることがあるので、私が使用するには消極的です。

+0

「ifelse文はpmml 4_3の認識可能な関数ではありません」と書いたとき、どういう意味ですか? –

+0

"if"は、pmml 4-3ドキュメントに従ったビルドイン機能ですが、 'ifelse'ではありません。したがって、コンテナ内でpmmlを実行すると、次のエラーメッセージが表示されます。org.jpmml.manager.UnsupportedFeatureException(行217またはその付近):Apply @ function = ifelse –

+0

これは意味をなさない: 'is.function(ifelse)'; #[1] TRUE。それは 'base'パッケージに入っていますので、常に利用できるはずです。 –

答えて

1

pmmlTransformationsパッケージには、「ifelse」Rの機能を処理する方法を知っている、と-であるとして、それを通過しません。それは[email protected]="if"を含むべきであると、得られるPMMLドキュメントは[email protected]="ifelse"が含まれている理由です。

PMML "if" built-in functionがあれば、他の分岐ロジックを表現する完全にことができます:

は、IF-THEN-ELSEロジックを実装します。 ELSEの部分はオプションです。 ELSE部分がなく、ブール値がfalseの場合、欠損値が返されます。溶液は、溶媒として

「ifelse」Rの機能を完全にサポートを含め、(「ボクシング」data.frameオブジェクトではなく)、その後、あなたが式の内部で機能エンジニアリングを行うことができますされ、r2pmml packageへの切り替えを検討してください:

library("randomForest") 
library("r2pmml") 

iris.rf = randomForest(Species ~ ifelse(Sepal.Length>5,Sepal.Length*1.2, Sepal.Length*.8) + ., data = iris) 

r2pmml(iris.rf, "iris.pmml") 
+0

pmmlパッケージのRスクリプトに 'ifelse'文を置き換える 'if'文を付けることもできますか?私は理解しr2pmmlメソッドを使用して述べたように、私は派生した機能にモデルを適用する前に、多くの機能操作の層を持っています。ありがとう! –

+0

"ifelse"関数はベクトル化された演算ですが、 "if"関数はベクトル化されません。この区別は、R式で作業する場合に重要です。 – user1808924

+0

これを指摘してくれてありがとう! @ user1808924 –

0

簡単に交換がうまくいくように見えます。

irisBox <- WrapData(iris) 
irisBox <- FunctionXform(irisBox,origFieldName="Sepal.Length", 
     newFieldName="Sepal.Length.Transformed", 
     formulaText="if(Sepal.Length>5) Sepal.Length*1.2 else Sepal.Length*.8") 
mod1 <- lm(Sepal.Length.Transformed ~ Petal.Length, irisBox$data) 
pmml(mod1, transform = irisBox) 
+0

生成されたPMMLドキュメントで、 'function =" ifelse "'を 'function =" if "'に手動で置き換えることで、同じ結果を達成できました。確かに、今は自動化されていますが、これはさらに優れています。 – user1808924

関連する問題