Importing libraries
library(ggplot2)
library(randomForest)
## Warning: package 'randomForest' was built under R version 4.3.3
## randomForest 4.7-1.1
## Type rfNews() to see new features/changes/bug fixes.
##
## Attaching package: 'randomForest'
## The following object is masked from 'package:ggplot2':
##
## margin
Importing Dataset
df<-read.csv("C:/Users/ONKAR/OneDrive/Desktop/SEM-4/Projects/Data Science/dataset.csv")
head(df,5)
Spliting Dataset into train and test Dataset
set.seed(123)
data_split_index <-sample(2,nrow(df),replace = TRUE,prob<-c(0.8,0.2))
train_dataset<-df[data_split_index==1,]
test_demo<-df[data_split_index==2,]
target<-as.factor(test_demo[,12])
test_dataset<-df[data_split_index==2,-12]
Converting train data to factor
train_dataset$age<-as.factor(train_dataset$age)
train_dataset$deep_conversations<-as.factor(train_dataset$deep_conversations)
train_dataset$role_father<-as.factor(train_dataset$role_father)
train_dataset$advice_from_father<-as.factor(train_dataset$advice_from_father)
train_dataset$improve_relationship<-as.factor(train_dataset$improve_relationship)
train_dataset$relationship_in_future<-as.factor(train_dataset$relationship_in_future)
train_dataset$relationship_with_father <- as.factor(train_dataset$relationship_with_father)
train_dataset$gender <- as.factor(train_dataset$gender)
train_dataset$native_place <- as.factor(train_dataset$native_place)
train_dataset$quality_time <- as.factor(train_dataset$quality_time)
train_dataset$qualification_of_father <- as.factor(train_dataset$qualification_of_father)
train_dataset$sharing_emotions <- as.factor(train_dataset$sharing_emotions)
train_dataset$deep_conversations <- as.factor(train_dataset$deep_conversations)
Converting Test data to factor
test_dataset$age <- as.factor(test_dataset$age)
test_dataset$deep_conversations <- as.factor(test_dataset$deep_conversations)
test_dataset$role_father <- as.factor(test_dataset$role_father)
test_dataset$advice_from_father <- as.factor(test_dataset$advice_from_father)
test_dataset$improve_relationship <- as.factor(test_dataset$improve_relationship)
test_dataset$relationship_in_future <- as.factor(test_dataset$relationship_in_future)
test_dataset$gender <- as.factor(test_dataset$gender)
test_dataset$native_place <- as.factor(test_dataset$native_place)
test_dataset$quality_time <- as.factor(test_dataset$quality_time)
test_dataset$qualification_of_father <- as.factor(test_dataset$qualification_of_father)
test_dataset$sharing_emotions <- as.factor(test_dataset$sharing_emotions)
test_dataset$deep_conversations <- as.factor(test_dataset$deep_conversations)
Training Model
random_forest<-randomForest(relationship_with_father~.,data=train_dataset)
print(random_forest)
##
## Call:
## randomForest(formula = relationship_with_father ~ ., data = train_dataset)
## Type of random forest: classification
## Number of trees: 500
## No. of variables tried at each split: 3
##
## OOB estimate of error rate: 39.56%
## Confusion matrix:
## Close Neutral Very close class.error
## Close 115 23 36 0.3390805
## Neutral 41 44 11 0.5416667
## Very close 44 6 87 0.3649635
Updating levels of train and test data to be equal
test_dataset$age <- factor(test_dataset$age, levels = levels(train_dataset$age))
test_dataset$deep_conversations <- factor(test_dataset$deep_conversations, levels = levels(train_dataset$deep_conversations))
test_dataset$role_father <- factor(test_dataset$role_father, levels = levels(train_dataset$role_father))
test_dataset$advice_from_father <- factor(test_dataset$advice_from_father, levels = levels(train_dataset$advice_from_father))
test_dataset$improve_relationship <- factor(test_dataset$improve_relationship, levels = levels(train_dataset$improve_relationship))
test_dataset$relationship_in_future <- factor(test_dataset$relationship_in_future, levels = levels(train_dataset$relationship_in_future))
test_dataset$gender <- factor(test_dataset$gender, levels = levels(train_dataset$gender))
test_dataset$native_place <- factor(test_dataset$native_place, levels = levels(train_dataset$native_place))
test_dataset$quality_time <- factor(test_dataset$quality_time, levels = levels(train_dataset$quality_time))
test_dataset$qualification_of_father <- factor(test_dataset$qualification_of_father, levels = levels(train_dataset$qualification_of_father))
test_dataset$sharing_emotions <- factor(test_dataset$sharing_emotions, levels = levels(train_dataset$sharing_emotions))
Prediction for test dataset
prediction_on_testdata <- predict(random_forest, newdata = test_dataset)
prediction_on_testdata
## 4 5 8 11 16 20 21
## Close Close Close Neutral Close Neutral Close
## 24 31 32 50 59 65 67
## Very close Neutral Close Close Close Very close Close
## 68 87 88 89 104 106 107
## Close Neutral Close Close Close Close Close
## 111 114 118 126 132 137 139
## Neutral Very close Close Very close Close Close Close
## 145 151 173 179 181 189 190
## Close Close Very close Close Close Close Close
## 193 195 202 206 219 220 222
## Neutral Very close Close Very close Close Very close Neutral
## 230 238 240 248 <NA> <NA> 261
## Neutral Close Close Neutral <NA> <NA> Very close
## 262 264 271 277 294 296 297
## Close Close Close Very close Very close Very close Very close
## 316 317 320 321 327 330 334
## Close Neutral Close Close Very close Close Close
## 340 347 352 356 360 363 373
## Close Neutral Neutral Close Close Neutral Close
## 376 380 386 391 400 401 403
## Close Neutral Very close Close Close Close Very close
## 412 417 425 430 431 434 445
## Neutral Neutral Very close Close Very close Close Close
## 456 457 461 470 472 482 485
## Very close Close Neutral Very close Close Close Neutral
## 490 491 496
## Neutral Close Very close
## Levels: Close Neutral Very close
library(lattice)
library(caret)
## Warning: package 'caret' was built under R version 4.3.3
Confusion matrix
rf_confusion_matrix<-confusionMatrix(prediction_on_testdata,target)
rf_confusion_matrix
## Confusion Matrix and Statistics
##
## Reference
## Prediction Close Neutral Very close
## Close 25 13 14
## Neutral 7 11 1
## Very close 3 0 18
##
## Overall Statistics
##
## Accuracy : 0.587
## 95% CI : (0.4795, 0.6887)
## No Information Rate : 0.3804
## P-Value [Acc > NIR] : 4.765e-05
##
## Kappa : 0.3638
##
## Mcnemar's Test P-Value : 0.01928
##
## Statistics by Class:
##
## Class: Close Class: Neutral Class: Very close
## Sensitivity 0.7143 0.4583 0.5455
## Specificity 0.5263 0.8824 0.9492
## Pos Pred Value 0.4808 0.5789 0.8571
## Neg Pred Value 0.7500 0.8219 0.7887
## Prevalence 0.3804 0.2609 0.3587
## Detection Rate 0.2717 0.1196 0.1957
## Detection Prevalence 0.5652 0.2065 0.2283
## Balanced Accuracy 0.6203 0.6703 0.7473
Accuracy
accuracy<-rf_confusion_matrix$overall["Accuracy"]*100
cat("Accuracy of model is ",accuracy," %")
## Accuracy of model is 58.69565 %
Creating sample Data frame for prediction
data_vector <- data.frame(
gender = as.factor("Male"),
age = as.factor(20),
native_place = as.factor("City"),
quality_time = as.factor("Regularly"),
qualification_of_father = as.factor("Graduate"),
sharing_emotions = as.factor("Yes"),
deep_conversations = as.factor("Regularly"),
role_father = as.factor("Consultant (offering advice)"),
advice_from_father = as.factor("Regularly"),
improve_relationship = as.factor("Yes"),
relationship_in_future = as.factor("More open communication and honesty")
)
data_vector$age <- factor(data_vector$age, levels = levels(train_dataset$age))
data_vector$deep_conversations <- factor(data_vector$deep_conversations, levels = levels(train_dataset$deep_conversations))
data_vector$role_father <- factor(data_vector$role_father, levels = levels(train_dataset$role_father))
data_vector$advice_from_father <- factor(data_vector$advice_from_father, levels = levels(train_dataset$advice_from_father))
data_vector$improve_relationship <- factor(data_vector$improve_relationship, levels = levels(train_dataset$improve_relationship))
data_vector$relationship_in_future <- factor(data_vector$relationship_in_future, levels = levels(train_dataset$relationship_in_future))
data_vector$gender <- factor(data_vector$gender, levels = levels(train_dataset$gender))
data_vector$native_place <- factor(data_vector$native_place, levels = levels(train_dataset$native_place))
data_vector$quality_time <- factor(data_vector$quality_time, levels = levels(train_dataset$quality_time))
data_vector$qualification_of_father <- factor(data_vector$qualification_of_father, levels = levels(train_dataset$qualification_of_father))
data_vector$sharing_emotions <- factor(data_vector$sharing_emotions, levels = levels(train_dataset$sharing_emotions))
Prediction of sample dataframe
predictions <- predict(random_forest, newdata = data_vector)
predictions
## 1
## Very close
## Levels: Close Neutral Very close