def _save_plot(self, predictor): """ Save Plots. Args: predictor: predictor instance Returns: predicter_weightmap_montage.png: Will output a montage of axial slices of weightmap predicter_prediction.png: Will output a plot of prediction """ if not os.path.isdir(self.output_dir): os.makedirs(self.output_dir) if self.algorithm == 'lassopcr': coef = np.dot(self._pca.components_.T,self._lasso.coef_) coef_img = self.nifti_masker.inverse_transform(np.transpose(coef)) elif self.algorithm == 'pcr': coef = np.dot(self._pca.components_.T,self._regress.coef_) coef_img = self.nifti_masker.inverse_transform(np.transpose(coef)) else: coef_img = self.nifti_masker.inverse_transform(predictor.coef_) overlay_img = nib.load(os.path.join(get_resource_path(),'MNI152_T1_2mm_brain.nii.gz')) fig1 = plot_stat_map(coef_img, overlay_img, title=self.algorithm + " weights", cut_coords=range(-40, 40, 10), display_mode='z') fig1.savefig(os.path.join(self.output_dir, self.algorithm + '_weightmap_axial.png')) if self.prediction_type == 'classification': if self.algorithm not in ['svm','ridgeClassifier','ridgeClassifierCV']: fig2 = probability_plot(self.stats_output) fig2.savefig(os.path.join(self.output_dir, self.algorithm + '_prob_plot.png')) else: fig2 = dist_from_hyperplane_plot(self.stats_output) fig2.savefig(os.path.join(self.output_dir, self.algorithm + '_Distance_from_Hyperplane_xval.png')) if self.algorithm == 'svm' and self.predictor.probability: fig3 = probability_plot(self.stats_output) fig3.savefig(os.path.join(self.output_dir, self.algorithm + '_prob_plot.png')) elif self.prediction_type == 'prediction': fig2 = scatterplot(self.stats_output) fig2.savefig(os.path.join(self.output_dir, self.algorithm + '_scatterplot.png'))
def predict(self, algorithm=None, cv_dict=None, plot=True, **kwargs): """ Run prediction Args: algorithm: Algorithm to use for prediction. Must be one of 'svm', 'svr', 'linear', 'logistic', 'lasso', 'ridge', 'ridgeClassifier','randomforest', or 'randomforestClassifier' cv_dict: Type of cross_validation to use. A dictionary of {'type': 'kfolds', 'n_folds': n}, {'type': 'kfolds', 'n_folds': n, 'subject_id': holdout}, or {'type': 'loso', 'subject_id': holdout}, where n = number of folds, and subject = vector of subject ids that corresponds to self.Y plot: Boolean indicating whether or not to create plots. **kwargs: Additional keyword arguments to pass to the prediction algorithm Returns: output: a dictionary of prediction parameters """ # Set algorithm if algorithm is not None: predictor_settings = set_algorithm(algorithm, **kwargs) else: # Use SVR as a default predictor_settings = set_algorithm('svr', **{'kernel':"linear"}) # Initialize output dictionary output = {} output['Y'] = np.array(self.Y).flatten() # Overall Fit for weight map predictor = predictor_settings['predictor'] predictor.fit(self.data, output['Y']) output['yfit_all'] = predictor.predict(self.data) if predictor_settings['prediction_type'] == 'classification': if predictor_settings['algorithm'] not in ['svm','ridgeClassifier','ridgeClassifierCV']: output['prob_all'] = predictor.predict_proba(self.data)[:,1] else: output['dist_from_hyperplane_all'] = predictor.decision_function(self.data) if predictor_settings['algorithm'] == 'svm' and predictor.probability: output['prob_all'] = predictor.predict_proba(self.data)[:,1] output['intercept'] = predictor.intercept_ # Weight map output['weight_map'] = self.empty() if predictor_settings['algorithm'] == 'lassopcr': output['weight_map'].data = np.dot(predictor_settings['_pca'].components_.T,predictor_settings['_lasso'].coef_) elif predictor_settings['algorithm'] == 'pcr': output['weight_map'].data = np.dot(predictor_settings['_pca'].components_.T,predictor_settings['_regress'].coef_) else: output['weight_map'].data = predictor.coef_.squeeze() # Cross-Validation Fit if cv_dict is not None: output['cv'] = set_cv(cv_dict) predictor_cv = predictor_settings['predictor'] output['yfit_xval'] = output['yfit_all'].copy() output['intercept_xval'] = [] output['weight_map_xval'] = deepcopy(output['weight_map']) wt_map_xval = []; if predictor_settings['prediction_type'] == 'classification': if predictor_settings['algorithm'] not in ['svm','ridgeClassifier','ridgeClassifierCV']: output['prob_xval'] = np.zeros(len(self.Y)) else: output['dist_from_hyperplane_xval'] = np.zeros(len(self.Y)) if predictor_settings['algorithm'] == 'svm' and predictor_cv.probability: output['prob_xval'] = np.zeros(len(self.Y)) for train, test in output['cv']: predictor_cv.fit(self.data[train], self.Y.loc[train]) output['yfit_xval'][test] = predictor_cv.predict(self.data[test]) if predictor_settings['prediction_type'] == 'classification': if predictor_settings['algorithm'] not in ['svm','ridgeClassifier','ridgeClassifierCV']: output['prob_xval'][test] = predictor_cv.predict_proba(self.data[test])[:,1] else: output['dist_from_hyperplane_xval'][test] = predictor_cv.decision_function(self.data[test]) if predictor_settings['algorithm'] == 'svm' and predictor_cv.probability: output['prob_xval'][test] = predictor_cv.predict_proba(self.data[test])[:,1] output['intercept_xval'].append(predictor_cv.intercept_) # Weight map if predictor_settings['algorithm'] == 'lassopcr': wt_map_xval.append(np.dot(predictor_settings['_pca'].components_.T,predictor_settings['_lasso'].coef_)) elif predictor_settings['algorithm'] == 'pcr': wt_map_xval.append(np.dot(predictor_settings['_pca'].components_.T,predictor_settings['_regress'].coef_)) else: wt_map_xval.append(predictor_cv.coef_.squeeze()) output['weight_map_xval'].data = np.array(wt_map_xval) # Print Results if predictor_settings['prediction_type'] == 'classification': output['mcr_all'] = np.mean(output['yfit_all']==np.array(self.Y).flatten()) print 'overall accuracy: %.2f' % output['mcr_all'] if cv_dict is not None: output['mcr_xval'] = np.mean(output['yfit_xval']==np.array(self.Y).flatten()) print 'overall CV accuracy: %.2f' % output['mcr_xval'] elif predictor_settings['prediction_type'] == 'prediction': output['rmse_all'] = np.sqrt(np.mean((output['yfit_all']-output['Y'])**2)) output['r_all'] = np.corrcoef(output['Y'],output['yfit_all'])[0,1] print 'overall Root Mean Squared Error: %.2f' % output['rmse_all'] print 'overall Correlation: %.2f' % output['r_all'] if cv_dict is not None: output['rmse_xval'] = np.sqrt(np.mean((output['yfit_xval']-output['Y'])**2)) output['r_xval'] = np.corrcoef(output['Y'],output['yfit_xval'])[0,1] print 'overall CV Root Mean Squared Error: %.2f' % output['rmse_xval'] print 'overall CV Correlation: %.2f' % output['r_xval'] # Plot if plot: if cv_dict is not None: if predictor_settings['prediction_type'] == 'prediction': fig2 = scatterplot(pd.DataFrame({'Y': output['Y'], 'yfit_xval':output['yfit_xval']})) elif predictor_settings['prediction_type'] == 'classification': if predictor_settings['algorithm'] not in ['svm','ridgeClassifier','ridgeClassifierCV']: output['roc'] = Roc(input_values=output['prob_xval'], binary_outcome=output['Y'].astype('bool')) else: output['roc'] = Roc(input_values=output['dist_from_hyperplane_xval'], binary_outcome=output['Y'].astype('bool')) if predictor_settings['algorithm'] == 'svm' and predictor_cv.probability: output['roc'] = Roc(input_values=output['prob_xval'], binary_outcome=output['Y'].astype('bool')) fig2 = output['roc'].plot() # output['roc'].summary() fig1=output['weight_map'].plot() return output
def _save_plot(self, predicter): """ Save Plots. Args: predicter: predicter instance Returns: predicter_weightmap_montage.png: Will output a montage of axial slices of weightmap predicter_prediction.png: Will output a plot of prediction """ if not os.path.isdir(self.output_dir): os.makedirs(self.output_dir) if self.algorithm is 'lassopcr': coef = np.dot(self._pca.components_.T, self._lasso.coef_) coef_img = self.nifti_masker.inverse_transform(np.transpose(coef)) elif self.algorithm is 'pcr': coef = np.dot(self._pca.components_.T, self._regress.coef_) coef_img = self.nifti_masker.inverse_transform(np.transpose(coef)) else: coef_img = self.nifti_masker.inverse_transform(predicter.coef_) overlay_img = nib.load( os.path.join(resource_dir, 'MNI152_T1_2mm_brain.nii.gz')) fig1 = plot_stat_map(coef_img, overlay_img, title=self.algorithm + " weights", cut_coords=range(-40, 40, 10), display_mode='z') fig1.savefig( os.path.join(self.output_dir, self.algorithm + '_weightmap_axial.png')) if self.prediction_type == 'classification': if self.algorithm not in [ 'svm', 'ridgeClassifier', 'ridgeClassifierCV' ]: fig2 = probability_plot(self.stats_output) fig2.savefig( os.path.join(self.output_dir, self.algorithm + '_prob_plot.png')) else: fig2 = dist_from_hyperplane_plot(self.stats_output) fig2.savefig( os.path.join( self.output_dir, self.algorithm + '_xVal_Distance_from_Hyperplane.png')) if self.algorithm is 'svm' and self.predicter.probability: fig3 = probability_plot(self.stats_output) fig3.savefig( os.path.join(self.output_dir, self.algorithm + '_prob_plot.png')) elif self.prediction_type == 'prediction': fig2 = scatterplot(self.stats_output) fig2.savefig( os.path.join(self.output_dir, self.algorithm + '_scatterplot.png'))