[Techie Project] Notebook 3 中的数据处理问题

老師,能不能在notebook 3裡再加一個sklearn的方法?

我試著仿照notebook 2,加了下面的code:

regression_model = LogisticRegression()    
regression_model.fit(X.reshape(-1, 2), Y.reshape(-1, 1))

print('Model intercept is: ', regression_model.intercept_[0])
print('Model coefficient is: ', regression_model.coef_[0])

y_predicted = regression_model.predict(X.reshape(-1, 2))

但是算出來的結果跟其他幾種方法差別很大

Model intercept is:  -0.11462462872138378
Model coefficient is:  [0.08227242 0.05527121]

不知道是model用錯了,還是畫圖錯了,畫圖用了下面的code

b_predicted = -(regression_model.coef_[0][0] * a + regression_model.intercept

这是reshape的问题。我在课上讲的X是np.array([x1[:,0], x2[:,0]]), 如果在这个基础上reshape,得到的X虽然也是200 x 2,但每个pair对应的不是原来的(x1, x2), 如果尝试把 X = np.concatenate((x1, x2), axis = 1),可以看到得出的结果是相似的。

加問幾個notebook 3的延伸問題:

在train模型的時候,假設我們知道使用的模型是underfitting或overfitting,要如何增加或減少模型的複雜度? 或是說,模型怎麼知道要選用多複雜的形式?

以sklearn方法來說,得出來的coef是x1和x2的參數,要怎麼知道x1和x2是幾次方? 或是有沒有x1和x2相乘項? 而sklearn在train的時候會自動調整x1和x2的次方數嗎? 還是我們需要手動給?

我試著在notebook 3中,將x1改成平方項

y = [(x1[i] ** 2) * 4 + x2[i] * 9 for i in range(n)]

使用sklearn和batch gradient descent得到的結果是

Model intercept is:  2.4984713179898073
Model coefficient is:  [0.01411581 0.77509076]

Final result: W is  [0.01426779 0.78869656] , b is  2.5287262763823053

假設sklearn自動使用了x1為平方項的模型,用以下公式畫圖

b_predicted = - (regression_model.coef_[0][0] * (a ** 2) + regression_model.intercept_[0]) / regression_model.coef_[0][1]
b_gd = -(W[0] * (a ** 2) + b) / W[1]

兩個方法得到的分類結果都非常差,不知道是模型使用錯誤,還是code錯了??

image

这部分已经涉及到课程内容没讲的内容。首先,sklearn的LogisticRegression只支持feature一次线性叠加的关系,即f(x) = ax1+bx2+…, 它不支持其他多项式形式的变化,也没有参数可以去调整。如果要实现你想做的事情,需要用sklearn里面的preprocessing.PolynomialFeatures,在后面接上logisticRegression, 这样就能构造出支持polynomial features的logistic regression。这部分的具体实现我建议用咱们课上介绍的sklearn pipeline,会更加容易。当然,具体应用中, 除非我们对模型有非常强的控制欲,否则,如果一次项关系的logistic regression如果不满足要求的话,我们会尝试使用其他nonlinear model。

抛开sklearn语境,如果我们想尝试nonlinear model是有章可循的吗?比如x要变成几次方,要不要feature之间相乘等等;这些后续课程会涉及吗?

然后我们说的模型,指的是linear regression, softmax regression这种,还是里面的frame ax1+bx2+…/x1^2+x2+…这些?我记得您上课说,model就那几个,是指的前述哪种呢?

  1. 想“尝试”的话, 必须要讨论对应的应用工具,没办法抛开语境。 如果不用sklearn的话, 你也可以用其他一些开源的统计library, 或者自己从零开始编写一个library. 如果脱离工具讨论这个事情的话, 那就是纯数学问题了,当然也就没办法像前面这位同学说的用数据取做实验看效果了。在sklearn里面用preprocessing.PolynomialFeatures去操作多项式高次项不是课程教学范围,已经是比较高阶的应用了。
  2. 我们说的模型是建立x (x1, x2, …)和y之间的关系, 因此是linear regression等着这些models.