Adaptive Difficulty Setting for Exercises
At Karuna Labs we have created a virtual reality software to treat chronic pain through cortical reorganization (aka neuroplasticity).
This entails slowly training our patient’s brain and body to recover the full extent of their movements through physiotheraputic exercises and visual inputs to reprogram the patient’s representations of their pain.
For example, if a patient has suffered a shoulder injury. In their sessions they will put on the VR headset and perform a daily task, such as picking up a can from a shelf. We will then slowly increase the difficulty level of the exercise (i.e. height of the shelf in this case) in subsequent sessions such that the patient does not notice this increase. In doing so the patient is able to progressively, but imperceptibly, regain their mobility.
The machine learning problem: How can we prepare a specialized training regime for a new patient using our database of patients who have successfully completed the sessions. Our database contains movement data captured through our sensors and the patients’ medical history.
That is, how do we decide the difficulty level of the exercises based on their health and current range of mobility.
We implement various supervised learning algorithms for regression in Scikit-learn.
General steps in creating a regression model
Data Exploration
Data Preparation – data cleaning, handling missing values, data transformations, normalizing.
Handling Outliers
Dimensionality Reduction – PCA, feature selection
Choosing appropriate models based on given data and desired outcomes.
Training models
Parameter Tuning
Measuring Performance on test/unseen data
In this tutorial we will primarily focus on training various regression models in Scikit-learn and measuring their performance.
1. Data Preparation
1.1. Read input data
# import librariesimport pandas as pdimport numpy as npfrom sklearn.metrics import mean_squared_error, r2_score# read in the datadata = pd.read_excel(“synthetic_final.xlsx”)# preview of the datadata.head(10)
# all column names
list(data.columns.values)['patient_id', 'promis29_score', 'age', 'sex', 'heart_health', 'diabetes', 'asthma', 'back_pain', 'arthritis', 'high_blood_pressure', 'height_inches', 'weight_pounds', 'difficulty_1', 'pain_1', 'rom_1', 'success_rate_1', 'difficulty_2', 'pain_2', 'rom_2', 'success_rate_2', 'difficulty_3', 'pain_3', 'rom_3', 'success_rate_3', 'difficulty_4', 'pain_4', 'rom_4', 'success_rate_4', 'difficulty_5', 'pain_5', 'rom_5', 'success_rate_5', 'difficulty_6', 'pain_6', 'rom_6', 'success_rate_6', 'difficulty_7', 'pain_7', 'rom_7', 'success_rate_7', 'difficulty_8', 'pain_8', 'rom_8', 'success_rate_8']
1.2. Data Dictionary
# patient_id - masked patient ID# promis29_score - a patient reported score based on a questionnaire on their health# age - age of the patient at the time of the first session# sex - sex of the patient# heart_health - 0 = healthy heart, 1 = unhealthy heart# diabetes - 0 = does not suffer from diabetes, 1 = suffers from diabetes# asthma - 0 = does not suffer from asthma, 1 = suffers from asthma# back_pain - 0 = no back pain, 1 = has back pain# arthritis - 0 = does not suffer from arthritis, 1 = suffers from arthritis# high_blood_pressure - 0 = normal BP, 1 = high BP# height_inches - height in inches# weight_pounds - wieght in pounds# difficulty_* - difficulty setting for the particlaur session.# pain_*' - pain reported by patient during session# rom_* - range of movement of the patient.# success_rate_* - success rate in completing the exercise.data.describe()
1.3. Splitting data into train and test sets
# split data into training and test
train = data.iloc[:80,:]test = data.iloc[80:,:]
# Predicting difficulty level for 8th session
# Preparing data by dropping unnecessary columns
train8X = train.drop(['patient_id', 'success_rate_1', 'success_rate_2', 'success_rate_3', 'success_rate_4', 'success_rate_5', 'success_rate_6', 'success_rate_7', 'difficulty_8', 'pain_8', 'rom_8','success_rate_8'], axis = 1)test8X = test.drop(['patient_id', 'success_rate_1', 'success_rate_2', 'success_rate_3', 'success_rate_4', 'success_rate_5', 'success_rate_6', 'success_rate_7','difficulty_8','pain_8','rom_8','success_rate_8'], axis = 1)train8Y = train.drop(['patient_id', 'promis29_score', 'age', 'sex', 'heart_health', 'diabetes', 'asthma', 'back_pain', 'arthritis', 'high_blood_pressure', 'height_inches', 'weight_pounds','difficulty_1', 'pain_1', 'rom_1', 'success_rate_1','difficulty_2', 'pain_2', 'rom_2', 'success_rate_2', 'difficulty_3', 'pain_3',rom_3','success_rate_3', 'difficulty_4', 'pain_4', 'rom_4', success_rate_4','difficulty_5', 'pain_5', 'rom_5', 'success_rate_5', 'difficulty_6', 'pain_6', 'rom_6', 'success_rate_6', 'difficulty_7', 'pain_7', 'rom_7', 'success_rate_7', 'pain_8', 'rom_8','success_rate_8'], axis = 1)test8Y = test.drop(['patient_id', 'promis29_score', 'age', 'sex', 'heart_health', 'diabetes', 'asthma', 'back_pain', 'arthritis', 'high_blood_pressure', 'height_inches', 'weight_pounds', 'difficulty_1','pain_1','rom_1', 'success_rate_1', 'difficulty_2', 'pain_2', 'rom_2','success_rate_2','difficulty_3','pain_3','rom_3','success_rate_3','difficulty_4','pain_4', 'rom_4', 'success_rate_4','difficulty_5','pain_5','rom_5','success_rate_5','difficulty_6','pain_6','rom_6','success_rate_6','difficulty_7','pain_7','rom_7',success_rate_7', 'pain_8','rom_8','success_rate_8'], axis = 1)
2. Regression Models
The regression models aim to make a prediction about what the difficulty setting should be for the eighth session, i.e. a value between 0 and 100.
2.1. Support Vector Machines
# import library
from
sklearn
import
svm
# train model on the training data
model_svm = svm.SVR()model_svm.fit(train8X, train8Y)
# make predictions on the test data
predicted_values = model_svm.predict(test8X)
# calculate error between the predicted values and the ground truth
print("Mean squared error:
%.5f
"% mean_squared_error(test8Y, predicted_values))print('Variance score:
%.2f
' % r2_score(test8Y, predicted_values))Mean squared error: 1.16618Variance score: -0.02
2.2. Linear Regression
from
sklearn
import
linear_modelreg_model = linear_model.LinearRegression()reg_model.fit(train8X, train8Y)reg_model.coef_predicted_reg = reg_model.predict(test8X)mean_squared_error(test8Y, predicted_reg)print("Mean squared error:
%.5f
"% mean_squared_error(test8Y, predicted_reg))print('Variance score:
%.2f
' % r2_score(test8Y, predicted_reg))Mean squared error: 1.96415Variance score: -0.71
2.3. Ridge Regression
ridge_reg = linear_model.Ridge(alpha = .5)ridge_reg.fit(train8X, train8Y)predicted_ridge = ridge_reg.predict(test8X)mean_squared_error(test8Y, predicted_ridge)print("Mean squared error:
%.5f
" % mean_squared_error(test8Y, predicted_ridge))print('Variance score:
%.2f
' % r2_score(test8Y, predicted_ridge))Mean squared error: 1.78342Variance score: -0.55
2.4. Lasso Regression
lasso_reg = linear_model.Lasso(alpha = 0.1)lasso_reg.fit(train8X, train8Y)predicted_lasso = lasso_reg.predict(test8X)mean_squared_error(test8Y, predicted_lasso)print("Mean squared error:
%.5f
"% mean_squared_error(test8Y, predicted_lasso))print('Variance score:
%.2f
' % r2_score(test8Y, predicted_lasso))Mean squared error: 1.09308Variance score: 0.05
2.5. Bayesian Ridge Regression
bayesian_ridge_reg = linear_model.BayesianRidge()bayesian_ridge_reg.fit(train8X, train8Y)predicted_bayes = bayesian_ridge_reg.predict(test8X)mean_squared_error(test8Y, predicted_bayes)print("Mean squared error:
%.5f
" % mean_squared_error(test8Y, predicted_bayes))print('Variance score:
%.2f
' % r2_score(test8Y, predicted_bayes))Mean squared error: 1.25829Variance score: -0.10
2.6. Regression Tree
#regression tree
from
sklearn
import
treeclf = tree.DecisionTreeRegressor()clf = clf.fit(train8X, train8Y)clf_pred = clf.predict(test8X)print("Mean squared error:
%.5f
" % mean_squared_error(test8Y, clf_pred))print('Variance score:
%.2f
' % r2_score(test8Y, clf_pred))Mean squared error: 2.00000Variance score: -0.74
2.7. Gradient Boosting Regression
from
sklearn.ensemble
import
GradientBoostingRegressorest = GradientBoostingRegressor(n_estimators=10, learning_rate=0.1,max_depth=1, random_state=0, loss='ls').fit(train8X, train8Y)print("Mean squared error:
%.5f
" % mean_squared_error(test8Y, est.predict(test8X)))print('Variance score:
%.2f
' % r2_score(test8Y, est.predict(test8X)))Mean squared error: 0.78961Variance score: 0.31
2.8. Multi Layer Perceptron
# multi layer perceptron
from
sklearn.neural_network
import
MLPRegressormlp_reg = MLPRegressor(solver='lbfgs', alpha=1e-5, hidden_layer_sizes=(15,), random_state=1)mlp_reg.fit(train8X, train8Y)print("Mean squared error:
%.5f
" % mean_squared_error(test8Y, mlp_reg.predict(test8X)))print('Variance score:
%.2f
' % r2_score(test8Y, mlp_reg.predict(test8X)))Mean squared error: 5.40565Variance score: -3.71
3. Conclusion
We see that the model with the least mean squared error in the ensemble method Gradient Boosting Regression. In the linear regression models we can see that Lasso regression performs the best.
.fca_eoi_form p { width: auto; }#fca_eoi_form_96 input{ max-width: 9999px; }div.fca_eoi_form_text_element,input.fca_eoi_form_input_element,input.fca_eoi_form_button_element{display:block;margin:0;padding:0;line-height:normal;font-size:14px;letter-spacing:normal;word-spacing:normal;text-indent:0;text-shadow:none;text-decoration:none;text-transform:none;white-space:normal;width:inherit;height:inherit;background-image:none;border:none;border-radius:0;box-shadow:none;box-sizing:border-box;transition:none;outline:none;-webkit-transition:none;-webkit-appearance:none;-moz-appearance:none;color:#000;font-family:"Open Sans", sans-serif;font-weight:normal;transition:background 350ms linear;}div.fca_eoi_form_text_element{text-align:center;}div.fca_eoi_layout_popup_close{display:block;margin:0;padding:0;line-height:normal;font-size:14px;letter-spacing:normal;word-spacing:normal;text-indent:0;text-shadow:none;text-decoration:none;text-transform:none;white-space:normal;width:inherit;height:inherit;background-image:none;border:none;border-radius:0;box-shadow:none;box-sizing:border-box;transition:none;outline:none;-webkit-transition:none;-webkit-appearance:none;-moz-appearance:none;color:#000;font-family:"Open Sans", sans-serif;font-weight:normal;display:block;position:absolute;z-index:9999992;top:-10px;right:-10px;background:rgba(0, 0, 0, 0.6);border:1px solid #000;color:#fff;font-weight:bold;width:20px;height:20px;line-height:20px;text-align:center;cursor:pointer;}div.fca_eoi_layout_headline_copy_wrapper{font-weight:bold;}div.fca_eoi_layout_1,form.fca_eoi_layout_1{display:inline-block;}div.fca_eoi_layout_1.fca_eoi_layout_widget,form.fca_eoi_layout_1.fca_eoi_layout_widget{max-width:300px;}div.fca_eoi_layout_1.fca_eoi_layout_postbox,form.fca_eoi_layout_1.fca_eoi_layout_postbox{max-width:600px;}div.fca_eoi_layout_1.fca_eoi_layout_popup,form.fca_eoi_layout_1.fca_eoi_layout_popup{max-width:650px;}div.fca_eoi_layout_1.fca_eoi_layout_widget div.fca_eoi_layout_field_wrapper,form.fca_eoi_layout_1.fca_eoi_layout_widget div.fca_eoi_layout_field_wrapper{float:none;width:100%;}div.fca_eoi_layout_1 div.fca_eoi_layout_content_wrapper,form.fca_eoi_layout_1 div.fca_eoi_layout_content_wrapper{margin:20px;}div.fca_eoi_layout_1 div.fca_eoi_layout_field_wrapper,form.fca_eoi_layout_1 div.fca_eoi_layout_field_wrapper{border:solid 1px transparent;width:49%;border-radius:3px;margin-bottom:10px;position:relative;}div.fca_eoi_layout_1 div.fca_eoi_layout_name_field_wrapper,form.fca_eoi_layout_1 div.fca_eoi_layout_name_field_wrapper{float:left;}div.fca_eoi_layout_1 div.fca_eoi_layout_email_field_wrapper,form.fca_eoi_layout_1 div.fca_eoi_layout_email_field_wrapper{float:right;}div.fca_eoi_layout_1 div.fca_eoi_layout_inputs_wrapper_no_name div.fca_eoi_layout_field_wrapper,form.fca_eoi_layout_1 div.fca_eoi_layout_inputs_wrapper_no_name div.fca_eoi_layout_field_wrapper{float:none;width:100%;}div.fca_eoi_layout_1 div.fca_eoi_layout_field_wrapper input,form.fca_eoi_layout_1 div.fca_eoi_layout_field_wrapper input,div.fca_eoi_layout_1 div.fca_eoi_layout_field_wrapper input:focus,form.fca_eoi_layout_1 div.fca_eoi_layout_field_wrapper input:focus{border:none !important;width:100%;height:auto;font-size:16px;line-height:1.2em;padding:7px 0;outline:none;background:none !important;box-shadow:none;}div.fca_eoi_layout_1 div.fca_eoi_layout_submit_button_wrapper,form.fca_eoi_layout_1 div.fca_eoi_layout_submit_button_wrapper{clear:both;transition:background 350ms linear, border-color 350ms linear;}div.fca_eoi_layout_1 div.fca_eoi_layout_fatcatapps_link_wrapper a,form.fca_eoi_layout_1 div.fca_eoi_layout_fatcatapps_link_wrapper a{display:block;margin:10px 0 0;font-size:12px;}@media (min-width:1px) and (max-width:450px),(min-height:1px) and (max-height:450px){div.fca_eoi_layout_1.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_headline_copy_wrapper div,form.fca_eoi_layout_1.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_headline_copy_wrapper div,div.fca_eoi_layout_1.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_headline_copy_wrapper div,form.fca_eoi_layout_1.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_headline_copy_wrapper div,div.fca_eoi_layout_1.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_headline_copy_wrapper div,form.fca_eoi_layout_1.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_headline_copy_wrapper div,div.fca_eoi_layout_1.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_description_copy_wrapper div,form.fca_eoi_layout_1.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_description_copy_wrapper div,div.fca_eoi_layout_1.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_description_copy_wrapper div,form.fca_eoi_layout_1.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_description_copy_wrapper div,div.fca_eoi_layout_1.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_description_copy_wrapper div,form.fca_eoi_layout_1.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_description_copy_wrapper div,div.fca_eoi_layout_1.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper i.fa:before,form.fca_eoi_layout_1.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper i.fa:before,div.fca_eoi_layout_1.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper i.fa:before,form.fca_eoi_layout_1.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper i.fa:before,div.fca_eoi_layout_1.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper i.fa:before,form.fca_eoi_layout_1.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper i.fa:before,div.fca_eoi_layout_1.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input,form.fca_eoi_layout_1.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input,div.fca_eoi_layout_1.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input,form.fca_eoi_layout_1.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input,div.fca_eoi_layout_1.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input,form.fca_eoi_layout_1.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input,div.fca_eoi_layout_1.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input:focus,form.fca_eoi_layout_1.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input:focus,div.fca_eoi_layout_1.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input:focus,form.fca_eoi_layout_1.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input:focus,div.fca_eoi_layout_1.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input:focus,form.fca_eoi_layout_1.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input:focus,div.fca_eoi_layout_1.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input,form.fca_eoi_layout_1.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input,div.fca_eoi_layout_1.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input,form.fca_eoi_layout_1.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input,div.fca_eoi_layout_1.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input,form.fca_eoi_layout_1.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input,div.fca_eoi_layout_1.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input:focus,form.fca_eoi_layout_1.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input:focus,div.fca_eoi_layout_1.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input:focus,form.fca_eoi_layout_1.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input:focus,div.fca_eoi_layout_1.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input:focus,form.fca_eoi_layout_1.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input:focus,div.fca_eoi_layout_1.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_privacy_copy_wrapper div,form.fca_eoi_layout_1.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_privacy_copy_wrapper div,div.fca_eoi_layout_1.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_privacy_copy_wrapper div,form.fca_eoi_layout_1.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_privacy_copy_wrapper div,div.fca_eoi_layout_1.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_privacy_copy_wrapper div,form.fca_eoi_layout_1.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_privacy_copy_wrapper div,div.fca_eoi_layout_1.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_fatcatapps_link_wrapper a,form.fca_eoi_layout_1.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_fatcatapps_link_wrapper a,div.fca_eoi_layout_1.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_fatcatapps_link_wrapper a,form.fca_eoi_layout_1.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_fatcatapps_link_wrapper a,div.fca_eoi_layout_1.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_fatcatapps_link_wrapper a,form.fca_eoi_layout_1.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_fatcatapps_link_wrapper a{font-size:13px !important;}}@media (min-width:1px) and (max-width:320px),(min-height:1px) and (max-height:320px){div.fca_eoi_layout_1.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_headline_copy_wrapper div,form.fca_eoi_layout_1.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_headline_copy_wrapper div,div.fca_eoi_layout_1.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_headline_copy_wrapper div,form.fca_eoi_layout_1.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_headline_copy_wrapper div,div.fca_eoi_layout_1.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_headline_copy_wrapper div,form.fca_eoi_layout_1.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_headline_copy_wrapper div,div.fca_eoi_layout_1.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_description_copy_wrapper div,form.fca_eoi_layout_1.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_description_copy_wrapper div,div.fca_eoi_layout_1.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_description_copy_wrapper div,form.fca_eoi_layout_1.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_description_copy_wrapper div,div.fca_eoi_layout_1.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_description_copy_wrapper div,form.fca_eoi_layout_1.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_description_copy_wrapper div,div.fca_eoi_layout_1.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper i.fa:before,form.fca_eoi_layout_1.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper i.fa:before,div.fca_eoi_layout_1.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper i.fa:before,form.fca_eoi_layout_1.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper i.fa:before,div.fca_eoi_layout_1.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper i.fa:before,form.fca_eoi_layout_1.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper i.fa:before,div.fca_eoi_layout_1.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input,form.fca_eoi_layout_1.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input,div.fca_eoi_layout_1.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input,form.fca_eoi_layout_1.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input,div.fca_eoi_layout_1.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input,form.fca_eoi_layout_1.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input,div.fca_eoi_layout_1.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input:focus,form.fca_eoi_layout_1.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input:focus,div.fca_eoi_layout_1.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input:focus,form.fca_eoi_layout_1.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input:focus,div.fca_eoi_layout_1.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input:focus,form.fca_eoi_layout_1.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_field_wrapper div.fca_eoi_layout_field_inner input:focus,div.fca_eoi_layout_1.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input,form.fca_eoi_layout_1.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input,div.fca_eoi_layout_1.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input,form.fca_eoi_layout_1.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input,div.fca_eoi_layout_1.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input,form.fca_eoi_layout_1.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input,div.fca_eoi_layout_1.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input:focus,form.fca_eoi_layout_1.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input:focus,div.fca_eoi_layout_1.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input:focus,form.fca_eoi_layout_1.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input:focus,div.fca_eoi_layout_1.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input:focus,form.fca_eoi_layout_1.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_submit_button_wrapper input:focus,div.fca_eoi_layout_1.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_privacy_copy_wrapper div,form.fca_eoi_layout_1.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_privacy_copy_wrapper div,div.fca_eoi_layout_1.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_privacy_copy_wrapper div,form.fca_eoi_layout_1.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_privacy_copy_wrapper div,div.fca_eoi_layout_1.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_privacy_copy_wrapper div,form.fca_eoi_layout_1.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_form_text_element.fca_eoi_layout_privacy_copy_wrapper div,div.fca_eoi_layout_1.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_fatcatapps_link_wrapper a,form.fca_eoi_layout_1.fca_eoi_layout_popup div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_fatcatapps_link_wrapper a,div.fca_eoi_layout_1.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_fatcatapps_link_wrapper a,form.fca_eoi_layout_1.fca_eoi_layout_widget div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_fatcatapps_link_wrapper a,div.fca_eoi_layout_1.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_fatcatapps_link_wrapper a,form.fca_eoi_layout_1.fca_eoi_layout_postbox div.fca_eoi_layout_content_wrapper div.fca_eoi_layout_fatcatapps_link_wrapper a{font-size:12px !important;}}@media (min-width:1px) and (max-width:450px),(min-height:1px) and (max-height:450px){div.fca_eoi_layout_1 div.fca_eoi_layout_content_wrapper,form.fca_eoi_layout_1 div.fca_eoi_layout_content_wrapper{margin:8px 13px;}div.fca_eoi_layout_1 div.fca_eoi_layout_fatcatapps_link_wrapper a,form.fca_eoi_layout_1 div.fca_eoi_layout_fatcatapps_link_wrapper a{margin:0;}div.fca_eoi_layout_1 div.fca_eoi_form_text_element.fca_eoi_layout_headline_copy_wrapper,form.fca_eoi_layout_1 div.fca_eoi_form_text_element.fca_eoi_layout_headline_copy_wrapper{margin-bottom:5px;}}@media (min-width:1px) and (max-width:320px),(min-height:1px) and (max-height:320px){div.fca_eoi_layout_1 div.fca_eoi_layout_popup_close,form.fca_eoi_layout_1 div.fca_eoi_layout_popup_close{top:-1px;right:-1px;}}@media (min-width:1px) and (max-width:768px){div.fca_eoi_layout_1 div.fca_eoi_layout_field_wrapper,form.fca_eoi_layout_1 div.fca_eoi_layout_field_wrapper{float:none;width:100%;}}div.fca_eoi_layout_1 div.fca_eoi_layout_headline_copy_wrapper,form.fca_eoi_layout_1 div.fca_eoi_layout_headline_copy_wrapper{margin-bottom:10px;}div.fca_eoi_layout_1 div.fca_eoi_layout_inputs_wrapper,form.fca_eoi_layout_1 div.fca_eoi_layout_inputs_wrapper{border-top:1px solid #dbdbdb;border-bottom:1px solid #dbdbdb;padding:20px 0;margin:20px 0;}@media (min-width:1px) and (max-width:450px),(min-height:1px) and (max-height:450px){div.fca_eoi_layout_1 div.fca_eoi_layout_inputs_wrapper,form.fca_eoi_layout_1 div.fca_eoi_layout_inputs_wrapper{padding:8px 0;}}@media (min-width:1px) and (max-width:320px),(min-height:1px) and (max-height:320px){div.fca_eoi_layout_1 div.fca_eoi_layout_inputs_wrapper,form.fca_eoi_layout_1 div.fca_eoi_layout_inputs_wrapper{padding:0;border:none;}}@media (min-width:1px) and (max-width:450px),(min-height:1px) and (max-height:450px){div.fca_eoi_layout_1 div.fca_eoi_layout_inputs_wrapper,form.fca_eoi_layout_1 div.fca_eoi_layout_inputs_wrapper{margin:8px 0;}}div.fca_eoi_layout_1 div.fca_eoi_layout_field_inner,form.fca_eoi_layout_1 div.fca_eoi_layout_field_inner{margin:0 15px 0 30px;}div.fca_eoi_layout_1 div.fca_eoi_layout_field_wrapper i.fa,form.fca_eoi_layout_1 div.fca_eoi_layout_field_wrapper i.fa{position:absolute;top:0;left:10px;height:50%;width:auto;transform:translateY(50%);-webkit-transform:translateY(50%);}div.fca_eoi_layout_1 div.fca_eoi_layout_submit_button_wrapper input,form.fca_eoi_layout_1 div.fca_eoi_layout_submit_button_wrapper input,div.fca_eoi_layout_1 div.fca_eoi_layout_submit_button_wrapper input:hover,form.fca_eoi_layout_1 div.fca_eoi_layout_submit_button_wrapper input:hover{border:solid 1px transparent !important;border-radius:3px;box-shadow:0 1px 1px rgba(255, 255, 255, .9) inset;font-weight:bold;margin:0;min-height:36px;width:100%;white-space:normal;background:none;background:-moz-linear-gradient(top, rgba(255, 255, 255, 0.35) 0%, rgba(255, 255, 255, 0.45) 48%, rgba(255, 255, 255, 0) 52%, rgba(255, 255, 255, 0) 100%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(255, 255, 255, 0.35)), color-stop(48%, rgba(255, 255, 255, 0.45)), color-stop(52%, rgba(255, 255, 255, 0)), color-stop(100%, rgba(255, 255, 255, 0)));background:-webkit-linear-gradient(top, rgba(255, 255, 255, 0.35) 0%, rgba(255, 255, 255, 0.45) 48%, rgba(255, 255, 255, 0) 52%, rgba(255, 255, 255, 0) 100%);background:-o-linear-gradient(top, rgba(255, 255, 255, 0.35) 0%, rgba(255, 255, 255, 0.45) 48%, rgba(255, 255, 255, 0) 52%, rgba(255, 255, 255, 0) 100%);background:-ms-linear-gradient(top, rgba(255, 255, 255, 0.35) 0%, rgba(255, 255, 255, 0.45) 48%, rgba(255, 255, 255, 0) 52%, rgba(255, 255, 255, 0) 100%);background:linear-gradient(to bottom, rgba(255, 255, 255, 0.35) 0%, rgba(255, 255, 255, 0.45) 48%, rgba(255, 255, 255, 0) 52%, rgba(255, 255, 255, 0) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#59ffffff', endColorstr='#00ffffff', GradientType=0);}@media (min-width:1px) and (max-width:450px),(min-height:1px) and (max-height:450px){div.fca_eoi_layout_1 div.fca_eoi_layout_headline_copy_wrapper,form.fca_eoi_layout_1 div.fca_eoi_layout_headline_copy_wrapper{margin-bottom:0;}}}.fca_eoi_form{ margin: auto; }#fca_eoi_form_96 .fca_eoi_layout_1.fca_eoi_layout_postbox{background-color:#ffffff !important;border-color:#d2d2d2 !important;}#fca_eoi_form_96 .fca_eoi_layout_1.fca_eoi_layout_postbox div.fca_eoi_layout_headline_copy_wrapper div{font-size:25px !important;color:#2b6b98 !important;}#fca_eoi_form_96 .fca_eoi_layout_1.fca_eoi_layout_postbox div.fca_eoi_layout_description_copy_wrapper p, .fca_eoi_layout_1.fca_eoi_layout_postbox div.fca_eoi_layout_description_copy_wrapper div{font-size:14px !important;}#fca_eoi_form_96 .fca_eoi_layout_1.fca_eoi_layout_postbox div.fca_eoi_layout_name_field_wrapper, .fca_eoi_layout_1.fca_eoi_layout_postbox div.fca_eoi_layout_name_field_wrapper input{color:#7f7f7f !important;background-color:#f5f5f5 !important;}#fca_eoi_form_96 .fca_eoi_layout_1.fca_eoi_layout_postbox div.fca_eoi_layout_name_field_wrapper{border-color:#cccccc !important;}#fca_eoi_form_96 .fca_eoi_layout_1.fca_eoi_layout_postbox div.fca_eoi_layout_email_field_wrapper, .fca_eoi_layout_1.fca_eoi_layout_postbox div.fca_eoi_layout_email_field_wrapper input{color:#7f7f7f !important;background-color:#f5f5f5 !important;}#fca_eoi_form_96 .fca_eoi_layout_1.fca_eoi_layout_postbox div.fca_eoi_layout_email_field_wrapper{border-color:#cccccc !important;}#fca_eoi_form_96 .fca_eoi_layout_1.fca_eoi_layout_postbox div.fca_eoi_layout_submit_button_wrapper input{font-size:14px !important;color:#996633 !important;background-color:#f5d03b !important;border-color:#eec22b !important;}#fca_eoi_form_96 .fca_eoi_layout_1.fca_eoi_layout_postbox div.fca_eoi_layout_submit_button_wrapper input:hover{background-color:#e9bd0c !important;}#fca_eoi_form_96 .fca_eoi_layout_1.fca_eoi_layout_postbox div.fca_eoi_layout_privacy_copy_wrapper div{font-size:14px !important;color:#8f8f8f !important;}#fca_eoi_form_96 .fca_eoi_layout_1.fca_eoi_layout_postbox div.fca_eoi_layout_fatcatapps_link_wrapper a, .fca_eoi_layout_1.fca_eoi_layout_postbox div.fca_eoi_layout_fatcatapps_link_wrapper a:hover{color:#baa34e !important;} jQuery.post( "http://unfetter.com/blog/", {'fca_eoi_track_form_id': 96 } );
Source: