作者的照片
在本文中,我们将分析校园安置数据,以深入了解数据中学生被安置的因素。由于数据非常少,有点不平衡,我们尝试做 EDA 和机器学习建模,以获得更好的结果。
数据集包含百分比、分数、课程专业、经验等。有两个输出列,即对于回归,我们可以将工资作为输出,对于分类,我们可以将状态作为输出。
让我们导入所有需要的库。
*# Import Libraries*
**import** **pandas** **as** **pd**
**import** **matplotlib.pyplot** **as** **plt**
**import** **numpy** **as** **np**
**from** **sklearn.metrics** **import** log_loss, confusion_matrix
**import** **seaborn** **as** **sns**
**from** **sklearn.neighbors** **import** KNeighborsClassifier
**from** **sklearn.metrics** **import** roc_curve, auc , precision_score , classification_report
**from** **sklearn.tree** **import** DecisionTreeClassifier
**import** **warnings**
warnings.filterwarnings('ignore')
**from** **sklearn.metrics** **import** confusion_matrix
**from** **sklearn.multiclass** **import** OneVsRestClassifier
阅读并查看数据集。
df = pd.read_csv('Placement_Data_Full_Class.csv')
df
作者的照片
现在,我们将做一些探索性的数据分析。
df.info()#output:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 215 entries, 0 to 214
Data columns (total 15 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 sl_no 215 non-null int64
1 gender 215 non-null object
2 ssc_p 215 non-null float64
3 ssc_b 215 non-null object
4 hsc_p 215 non-null float64
5 hsc_b 215 non-null object
6 hsc_s 215 non-null object
7 degree_p 215 non-null float64
8 degree_t 215 non-null object
9 workex 215 non-null object
10 etest_p 215 non-null float64
11 specialisation 215 non-null object
12 mba_p 215 non-null float64
13 status 215 non-null object
14 salary 148 non-null float64
dtypes: float64(6), int64(1), object(8)
memory usage: 25.3+ KB
映射集群的状态列
#replacing status column categories to 0 and 1
df['status'] = df['status'].map({"Placed":1, "Not Placed":0})
#filling null values in salary with 0
df.salary.fillna(0,inplace=**True**)
df.head()
作者的照片
检查数据集中缺失的值
*#missing values*
df.isna().sum()#output:
sl_no 0
gender 0
ssc_p 0
ssc_b 0
hsc_p 0
hsc_b 0
hsc_s 0
degree_p 0
degree_t 0
workex 0
etest_p 0
specialisation 0
mba_p 0
status 0
salary 0
dtype: int64
检查分类的状态列
sns.countplot(x="status", palette="dark", data=df);
作者的照片
使用 seaborn 库的 pairplot 对数据进行可视化检查
sns.pairplot(data=df, kind="reg");
作者的照片
基于性别检查工资
placed = df[df["status"]==1][["gender","salary", "workex"]]
sns.catplot(y="salary", x="gender", kind="swarm", palette="dark"
,data=placed);
猫图。作者的照片
男性似乎比女性更倾向于高薪。
pub.towardsai.net](/machine-learning-16c8ccc2c7b8)
需要对分类特征进行标签编码
**from** **sklearn.preprocessing** **import** LabelEncoder
le=LabelEncoder()
**for** i **in** categorical:
df[i]=le.fit_transform(df[i])df
作者的照片
我们可以在上面的数据中看到,特征已经被标注,准备进入机器学习建模。
df_reg_x = df.drop(['sl_no','salary'],1)
df_reg_y = df.salary**from** **sklearn.model_selection** **import** train_test_split
X_train, X_test, y_train, y_test = train_test_split(df_reg_x, df_reg_y, test_size = 0.15)**from** **sklearn.preprocessing** **import** StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)sc_y = StandardScaler()y_train = sc_y.fit_transform(np.array(y_train).reshape(-1,1))y_test = sc_y.transform(np.array(y_test).reshape(-1,1))
- 线性回归
**from** **sklearn.linear_model** **import** LinearRegressionmodel1 = LinearRegression()
model1.fit(X_train,y_train)
y_pred = model1.predict(X_test)**from** **sklearn.metrics** **import** mean_squared_error, r2_scoreprint('MSE of Linear Regressor Model--->' ,
mean_squared_error(y_test,y_pred))
print('r2_score of Linear Model--->' , r2_score(y_test,y_pred))#output:
MSE of Linear Regressor Model---> 0.06942385507687932
r2_score of Linear Model---> 0.9073385898967523
2.近邻回归量
**from** **sklearn.neighbors** **import** KNeighborsRegressorneigh = KNeighborsRegressor(n_neighbors=11)
neigh.fit(X_train, y_train)
y_pred = neigh.predict(X_test)**from** **sklearn.metrics** **import** mean_squared_error, r2_scoreprint('MSE of KNeighbors Regressor Model--->' ,
mean_squared_error(y_test,y_pred))
print('r2_score of Linear Model--->' , r2_score(y_test,y_pred))#output:
MSE of KNeighbors Regressor Model---> 0.29273900427438526
r2_score of Linear Model---> 0.6092753867061032
3.决策树回归器
**from** **sklearn.tree** **import** DecisionTreeRegressorregressor = DecisionTreeRegressor()
regressor.fit(X_train, y_train)
y_pred = regressor.predict(X_test)print('MSE of DecisionTree Regressor Model--->' ,
mean_squared_error(y_test,y_pred))
print('r2_score of Linear Model--->' , r2_score(y_test,y_pred))#output:
MSE of DecisionTree Regressor Model---> 0.13344250885495113
r2_score of Linear Model---> 0.8218916102466214
df_class_x = df.drop(['salary','sl_no','status'],1)
df_class_y = df.status**from** **sklearn.model_selection** **import** train_test_split
X_train, X_test, y_train, y_test = train_test_split(df_class_x,
df_class_y, stratify=df_class_y, test_size = 0.15)
- 逻辑回归
**from** **sklearn.linear_model** **import** LogisticRegression
**from** **sklearn.metrics** **import** roc_auc_score
**from** **sklearn.model_selection** **import** GridSearchCVparameters = [{'C': [10**x **for** x **in** range(-4,5)]}]
K =[10**x **for** x **in** range(-4,5)]
K = np.log10(K)
log= LogisticRegression(penalty='l2')
clf = GridSearchCV(log, parameters, cv=5, scoring='roc_auc',return_train_score=**True**)
clf.fit(X_train, y_train)
train_auc= clf.cv_results_['mean_train_score']
train_auc_std= clf.cv_results_['std_train_score']
cv_auc = clf.cv_results_['mean_test_score']
cv_auc_std= clf.cv_results_['std_test_score']
lamb= clf.best_params_
lamb = list(lamb.values())[0]
plt.figure(figsize=(10, 7))
plt.plot(K, train_auc, label='Train AUC')
plt.gca().fill_between(K,train_auc - train_auc_std,train_auc + train_auc_std,alpha=0.2,color='darkblue')
plt.plot(K, cv_auc, label='CV AUC')
plt.gca().fill_between(K,cv_auc - cv_auc_std,cv_auc + cv_auc_std,alpha=0.2,color='darkorange')
plt.scatter(K, train_auc, label='Train AUC points')
plt.scatter(K, cv_auc, label='CV AUC points')
plt.grid(**True**)
plt.legend()
plt.xlabel("C: hyperparameter")
plt.ylabel("AUC")
plt.title("ERROR PLOTS")
plt.show()
print('The best value of C is : ' , lamb)
训练和测试 AUR 曲线。作者的照片
C 的最佳值是:0.1
最佳超参数拟合模型
log= LogisticRegression(penalty='l2',C = 0.001)
log.fit(X_train,y_train)
train_fpr, train_tpr, thresholds = roc_curve(y_train,
log.predict_proba(X_train)[:,1])
test_fpr, test_tpr, thresholds = roc_curve(y_test,
log.predict_proba(X_test)[:,1])
plt.plot(train_fpr, train_tpr, label="train AUC
="+str(auc(train_fpr, train_tpr)))
plt.plot(test_fpr, test_tpr, label="test AUC ="+str(auc(test_fpr,
test_tpr)))
plt.legend()
plt.grid(**True**)
plt.xlabel("False Positive Rate")
plt.ylabel("True Positive Rate")
plt.title("ROC Curve")
plt.plot([0, 1], [0, 1],'r--')
plt.xlim([0, 1])
plt.ylim([0, 1])
plt.show()
ROC 曲线。作者的照片
打印分类报告
y_pred = log.predict(X_test)
print (classification_report(y_test,y_pred))
作者的照片
混淆矩阵
heatmap(confusion_matrix(y_test,y_pred),
annot=**True**,fmt="d",cmap='Blues')
作者的照片
在校正不平衡的数据集之后,可以应用回归和分类算法。
我希望你喜欢这篇文章。通过我的 LinkedIn 和 twitter 联系我。
1。NLP —零到英雄与 Python 2。 Python 数据结构数据类型和对象3 .Python 中的异常处理概念 4。为什么 LSTM 在深度学习方面比 RNN 更有用? 5。神经网络:递归神经网络的兴起 6。用 Python 7 全面讲解了线性回归。用 Python 充分解释了 Logistic 回归 8。concat()、merge()和 join()与 Python 的区别 9。与 Python 的数据角力—第一部分 10。机器学习中的混淆矩阵