机器学习赛事(四):快来一起挖掘幸福感
机器学习训练营:
https://tianchi.aliyun.com/s/20d6735792ef867814c90698221d1499
比赛题目
赛题使用公开数据的问卷调查结果,选取其中多组变量,包括个体变量(性别、年龄、地域、职业、健康、婚姻与政治面貌等等)、家庭变量(父母、配偶、子女、家庭资本等等)、社会态度(公平、信用、公共服务等等),来预测其对幸福感的评价。
幸福感预测的准确性不是赛题的唯一目的,更希望选手对变量间的关系、变量群的意义有所探索与收获。
数据预处理
导入数据之后,先对数据进行预处理,寻找缺失值,若缺失值个数超过总样本数的1/2,值剔除该数据特征。其余的缺失值将由均值填补。
def filter_extreme_3sigma(series,n=3): #3 sigma
mean = series.mean()
std = series.std()
max_range = mean + n*std
min_range = mean - n*std
return np.clip(series,min_range,max_range)
然后用3 sigma 对数据进行异常值处理,对数据进行标准化处理。
scaler=StandardScaler(with_mean=True,with_std=True)
data_train.iloc[:,:127]=scaler.fit_transform(data_train.iloc[:,:127])
data_train
用KNN算法对其进行分类,并结合标签计算预测的准确率
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
seed=5
x_train,x_test,y_train,y_test=train_test_split(data_train,y,test_size=0.25,random_state=seed)
clf=KNeighborsClassifier(20)
clf.fit(x_train,y_train)
X_pred = clf.predict(x_test)
acc = sum(X_pred == y_test) / X_pred.shape[0]
print("预测的准确率ACC: %.3f" % acc)
预测的准确率不理想,该用随机森林进行分类预测。
from sklearn.ensemble import RandomForestClassifier
rf=RandomForestClassifier(n_estimators=200,max_features=8,max_depth=20,oob_score=True,random_state=1)
rf.fit(x_train,y_train)
print('oob score:',round(rf.oob_score_,4)*100,'%')
trainpre_y=rf.predict(x_test)
acc = sum(trainpre_y == y_test) / trainpre_y.shape[0]
print("预测的准确率ACC: %.3f" % acc)
结果与随机森林的差不多。
可能是对数据的清理上有缺陷,可以再去尝试别的方法,再加上对特征的筛选和对数据进行不平衡处理,得出的结果可能会更好一些。