def Call_SV_Reg(X_train, y_train, X_test, y_test):
    """
    SVM Regression
    """

    clf = SVR()

    parameters = [{
        'C': [1, 10, 100, 1000],
        'gamma': [1e-1, 1, 1e1],
        'kernel': ['rbf', 'linear', 'poly', 'sigmoid'],
        'degree': [3],
        'epsilon': [0.9]
    }]
    scoring_function = make_scorer(r2_score, greater_is_better=True)
    # Make the GridSearchCV object
    clf = GridSearchCV(clf, parameters, scoring=scoring_function, cv=10)

    clf.fit(X_train, y_train)
    Predicted = clf.predict(X_test)
    print("SVR Score = ", clf.score(X_test, y_test))

    MSE = mean_squared_error(y_test, Predicted)
    R2 = r2_score(y_test, Predicted)
    plot_regression(y_test, 'SV Reg', Predicted)
    return "SVR Mean Square Error =", MSE, "SVR R2 =", R2
def Call_KNN_Reg(X_train, y_train, X_test, y_test):
    """
    KNN Regression
    """
    clf = KNeighborsRegressor()
    clf.fit(X_train, y_train)
    Predicted = clf.predict(X_test)
    print("KNeighborsRegressor Score = ", clf.score(X_test, y_test))
    MSE = mean_squared_error(y_test, Predicted)
    R2 = r2_score(y_test, Predicted)
    plot_regression(y_test, 'KNN Reg', Predicted)
    return "KNeighborsRegressor MSE =", MSE, "KNeighborsRegressor R2 =", R2
def Call_GradientBoosting_Reg(X_train, y_train, X_test, y_test):
    """
    Gradient Boosting Regression
    """

    clf = ensemble.GradientBoostingRegressor()
    clf.fit(X_train, y_train)
    Predicted = clf.predict(X_test)
    print("GradientBoostingRegressor Score = ", clf.score(X_test, y_test))
    MSE = mean_squared_error(y_test, Predicted)
    R2 = r2_score(y_test, Predicted)
    plot_regression(y_test, 'GradientBoosting Reg', Predicted)

    return "GradientBoosting MSE =", MSE, "GradientBoosting R2 =", R2
def Call_AdaBoost_Reg(X_train, y_train, X_test, y_test):
    """
    Ada Boost Regression
    """

    clf = ensemble.AdaBoostRegressor()
    clf.fit(X_train, y_train)
    Predicted = clf.predict(X_test)
    print("AdaBoostRegressor Score = ", clf.score(X_test, y_test))
    MSE = mean_squared_error(y_test, Predicted)
    R2 = r2_score(y_test, Predicted)
    plot_regression(y_test, 'AdaBoost Reg', Predicted)

    return "AdaBoost MSE =", MSE, "AdaBoost R2 =", R2
def Call_Bagging_Reg(X_train, y_train, X_test, y_test):
    """
    Bagging Regression
    """

    clf = ensemble.BaggingRegressor()

    clf.fit(X_train, y_train)
    Predicted = clf.predict(X_test)
    print("BaggingRegressor Score = ", clf.score(X_test, y_test))
    MSE = mean_squared_error(y_test, Predicted)
    R2 = r2_score(y_test, Predicted)
    plot_regression(y_test, 'Bagging Reg', Predicted)

    return "BaggingRegressor MSE =", MSE, "BaggingRegressor R2 =", R2
def Call_DecisionTree_Reg(X_train, y_train, X_test, y_test):
    """ Tunes a decision tree regressor model using GridSearchCV on the input data X 
        and target labels y and returns this optimal model. """

    # Create a decision tree regressor object
    regressor = DecisionTreeRegressor(max_depth=2,
                                      min_samples_leaf=1,
                                      min_samples_split=2,
                                      splitter='best')

    # Set up the parameters we wish to tune
    parameters = [{
        'max_depth': (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
                      17, 18, 19, 20),
        'presort': ['True']
    }]

    # Make an appropriate scoring function
    scoring_function = None
    #scoring_function = make_scorer(performance_metric(), greater_is_better=False)
    scoring_function = make_scorer(r2_score, greater_is_better=True)

    # Make the GridSearchCV object
    reg = None
    reg = GridSearchCV(regressor, parameters, scoring=scoring_function, cv=10)

    # Fit the learner to the data to obtain the optimal model with tuned parameters
    reg.fit(X_train, y_train)
    Predicted = reg.predict(X_test)
    print("DecisionTreeRegressor = ", reg.score(X_test, y_test))

    #print "Best model parameter:  " + str(reg.best_params_)
    #print "Best model estimator:  " + str(reg.best_estimator_)
    # Return the optimal model
    Best_Estimator = reg.best_estimator_
    MSE = mean_squared_error(y_test, Predicted)
    R2 = r2_score(y_test, Predicted)

    #    print("y_test :",y_test.head(),y_test[1])
    #    print("y_test_1 :",y_test.shape)
    plot_regression(y_test, 'DecisionTree Reg', Predicted)

    learning_curves(X_train, y_train, X_test, y_test)
    model_complexity(X_train, y_train, X_test, y_test)
    return "DecisionTreeRegressor Best Estimator ", Best_Estimator, "DecisionTreeRegressor MSE =", MSE, "DecisionTreeRegressor R2 =", R2
def Call_RandomForest_Reg(X_train, y_train, X_test, y_test):
    """
    Random Forest Regression
    """
    clf = ensemble.RandomForestRegressor(n_estimators=100, n_jobs=-1)

    parameters = [{
        'n_estimators': [20],
        'criterion': ['mse'],
        'min_weight_fraction_leaf': [0.25],
        'n_jobs': [-1]
    }]
    scoring_function = make_scorer(r2_score, greater_is_better=True)
    # Make the GridSearchCV object
    clf = GridSearchCV(clf, parameters, scoring=scoring_function, cv=10)

    clf = clf.fit(X_train, y_train)
    Predicted = clf.predict(X_test)
    print("RandomForestRegressor Score = ", clf.score(X_test, y_test))
    MSE = mean_squared_error(y_test, Predicted)
    R2 = r2_score(y_test, Predicted)
    plot_regression(y_test, 'RandomForest Reg', Predicted)
    return "Random Forest Predicted Mean Square Error =", MSE, "and Random Forest R-Square =", R2