import pandas as pd
# turn of warning messages
pd.options.mode.chained_assignment = None # default='warn'
# get data
df = pd.read_csv('student_records.csv')
df
# get features and corresponding outcomes
feature_names = ['OverallGrade', 'Obedient', 'ResearchScore', 'ProjectScore']
training_features = df[feature_names]
outcome_name = ['Recommend']
outcome_labels = df[outcome_name]
# view features
training_features
# view outcome labels
outcome_labels
# list down features based on type
numeric_feature_names = ['ResearchScore', 'ProjectScore']
categoricial_feature_names = ['OverallGrade', 'Obedient']
from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
# fit scaler on numeric features
ss.fit(training_features[numeric_feature_names])
# scale numeric features now
training_features[numeric_feature_names] = ss.transform(training_features[numeric_feature_names])
# view updated featureset
training_features
training_features = pd.get_dummies(training_features, columns=categoricial_feature_names)
# view newly engineering features
training_features
# get list of new categorical features
categorical_engineered_features = list(set(training_features.columns) - set(numeric_feature_names))
from sklearn.linear_model import LogisticRegression
import numpy as np
# fit the model
lr = LogisticRegression()
model = lr.fit(training_features, np.array(outcome_labels['Recommend']))
# view model parameters
model
# simple evaluation on training data
pred_labels = model.predict(training_features)
actual_labels = np.array(outcome_labels['Recommend'])
# evaluate model performance
from sklearn.metrics import accuracy_score
from sklearn.metrics import classification_report
print('Accuracy:', float(accuracy_score(actual_labels, pred_labels))*100, '%')
print('Classification Stats:')
print(classification_report(actual_labels, pred_labels))
from sklearn.externals import joblib
import os
# save models to be deployed on your server
if not os.path.exists('Model'):
os.mkdir('Model')
if not os.path.exists('Scaler'):
os.mkdir('Scaler')
joblib.dump(model, r'Model/model.pickle')
joblib.dump(ss, r'Scaler/scaler.pickle')
# load model and scaler objects
model = joblib.load(r'Model/model.pickle')
scaler = joblib.load(r'Scaler/scaler.pickle')
## data retrieval
new_data = pd.DataFrame([{'Name': 'Nathan', 'OverallGrade': 'F', 'Obedient': 'N', 'ResearchScore': 30, 'ProjectScore': 20},
{'Name': 'Thomas', 'OverallGrade': 'A', 'Obedient': 'Y', 'ResearchScore': 78, 'ProjectScore': 80}])
new_data = new_data[['Name', 'OverallGrade', 'Obedient', 'ResearchScore', 'ProjectScore']]
new_data
## data preparation
prediction_features = new_data[feature_names]
# scaling
prediction_features[numeric_feature_names] = scaler.transform(prediction_features[numeric_feature_names])
# engineering categorical variables
prediction_features = pd.get_dummies(prediction_features, columns=categoricial_feature_names)
# view feature set
prediction_features
# add missing categorical feature columns
current_categorical_engineered_features = set(prediction_features.columns) - set(numeric_feature_names)
missing_features = set(categorical_engineered_features) - current_categorical_engineered_features
for feature in missing_features:
# add zeros since feature is absent in these data samples
prediction_features[feature] = [0] * len(prediction_features)
# view final feature set
prediction_features
## predict using model
predictions = model.predict(prediction_features)
## display results
new_data['Recommend'] = predictions
new_data