本学习材料主要包括以下四个方面的内容 * 机器学习的基础介绍 * 特征工程与特征筛选 * 基础模型的训练与预测 * 机器学习实验流程
3.1 查看空值比例
## 查看空值比例 data_na = (data.isnull().sum()/len(data))*100 data_na = data_na.drop(data_na[data_na == 0].index).sort_values(ascending=False) missing_data = pd.DataFrame(data_na) missing_data.columns=['缺失比例'] missing_data3.2 绘制空值比例的条形图
## 绘制空值比例的条形图 plt.figure(figsize=(15,10)) sns.barplot(x=data_na.index, y=data_na) plt.xlabel('特征', fontsize=15) plt.ylabel('缺失比例', fontsize=15)3.3 缺省值填充
## 对于数值型变量的缺失值用中位数进行填充 feature1 = ['最低血压','腰围','最高血压','体重指数','肥胖腰围','身高','体重','好胆固醇','总胆固醇','坏胆固醇'] for i in feature1: data[i] = data[i].fillna(data[i].median()) ## 对于分类型变量的缺失值用众数进行填充 feature2 = ['收入','未婚','视力不佳','高血压','慢性疲劳','肝炎','教育','糖尿病'] for i in feature2: data[i] = data[i].fillna(data[i].mode()) data[i] = data[i].fillna(0.0) ##上面一行插不上,不知道为啥3.4 特征偏度计算
## 计算特征偏度 from scipy.stats import skew skewed_feats = data.apply(lambda x: skew(x.dropna())).sort_values(ascending=False) skewness = pd.DataFrame(skewed_feats) skewness.columns=['skewness'] skewness3.5 数值分布正态分布
# 对偏态分布的数据进行变换(Box-Cox),使其更加服从正态分布 from scipy.special import boxcox1p skewness = skewness[abs(skewness) > 0.75] print('There are {} skewed numerical features'.format(skewness.shape[0])) skewed_features = skewness.index ## 仅对数值型变量进行标准化 skew_features=['体重指数','体重','好胆固醇', '最高血压','腰围','坏胆固醇', '总胆固醇', '年龄', '身高', '最低血压'] lam = 0.15 for feat in skew_features: data[feat] = boxcox1p(data[feat], lam) ## 转换哑变量 obj=['性别','区域','血脂异常','PVD','体育活动','教育','收入','未婚','视力不佳','饮酒','高血压','家庭高血压','慢性疲劳','肝炎','家族肝炎','护理来源','糖尿病','家族糖尿病'] for i in obj: data[i]=data[i].astype(object) data = pd.get_dummies(data) data.head()3.6 训练集测试集划分
train = data[0:700] train_x = train.drop('ALF', axis=1) train_y = train['ALF'] val = data[700:] val_x = val.drop('ALF', axis=1) val_y = val['ALF']3.7 特征筛选
## 特征重要性检测 from sklearn.linear_model import Lasso ## 拟合lasso模型 lasso=Lasso(alpha=0.001) lasso.fit(train_x,train_y) ## 计算特征重要性 FI_lasso = pd.DataFrame({"Feature Importance":lasso.coef_}, index=train_x.columns) FI_lasso.sort_values("Feature Importance",ascending=False)3.8 基础模型训练与预测
## KNN from sklearn.neighbors import KNeighborsClassifier from sklearn.model_selection import cross_val_score X=data.drop('ALF',axis=1) y=data['ALF'] ## 对不同的k算分 scores=[] for i in range(1,11): knn=KNeighborsClassifier(n_neighbors=i) #选择邻近的i个点 score=cross_val_score(knn,X,y,cv=5,scoring='accuracy')#评分方式为accuracy scores.append(score.mean()) ## 画图 plt.plot(scores) xtick=['1','2','3','4','5','6','7','8','9','10'] plt.xticks(range(0,10),xtick) plt.show()