王聖曜
May 31, 2018
過往的推薦系統,大多是根據使用者過往點擊過、使用過的紀錄,去做相關的推薦,比方說有課程(產品)與使用者之前修過的某課程屬性相同,它就會推薦給使用者;或是找到與使用者有相同屬性的其它使用者,其它使用者喜歡怎麼樣的課程,也會相對應認為該使用者同樣的課程,而做出推薦,像是近幾年較熱門的推薦系統-協同式過濾推薦系統,即是採用兩種面向的結合,使用者的屬性、課程的屬性,去協同猜測使用者喜歡的東西,進而做出推薦的功能。
這其實面臨到一項問題,該使用者被推薦的課程會被侷限在同一個圈圈裡,在某些領域來說,這不一定會是一件好事,以論文的資料-課程推薦來說,當一位成績較差的同學,以相同屬性的學生、課程去做推薦,就會一直在低層成績表現徘徊,雖然學生在選課考量無非就是兩種想法,一種是想要好成績、求過的課程,另一種是依據興趣來做選擇,但我們或許可以不僅僅以學生相關性、興趣來做純粹的推薦,而是以下限制式的推薦系統,或極大化學生的某項選擇,來導入機器學習或深度學習模型中讓學生達到某項目標。
在此課程推薦系統中,我將以學生極大化在專業領域的知識,來做專業選修的課程推薦,期盼學生在此推薦系統中可以提升自己在該科系的專業領域知識。
學生在每個學期初選擇課程時,系統會推薦幾項根據過往表現,極大化專業領域為目的、興趣上的可能,來推薦學生幾項選擇。相信學生在看過課程推薦後,會對選課有更多考量,增加學生對課程的興趣及信心,也能減少學生期中退選的機率,降低選課成本。
資料來源是台北大學涵蓋100年到106年的學生資料,其中的rows為每一位學生曾經修過的課程,而columns則是該位學生各個課程的表現以及課程的資訊。但我們目前只討論100學年度到103學年度這四個學年度進來的同學,資料中學生都是擁有完整學年度體驗(四個學年含以上),截至他們到106年度末修課的狀況。而其他後來進來的同學將會先予以剔除,在之後推薦課程中可以做測試。
我們可以先了解一個學生在大學四年來的課程,是由哪些課程組成。學生畢業前會修習的課程包含了必修、選修,其中必修又分為專業必修、校訂必修,選修分為專業選修、自由選修:
專業必修:學生主修系上所規劃的必修課程,學生需要將這些課程修習及格才能畢業。
校訂必修:共同必修、通識
共同必修:各個系別學生都需要修畢的課程,如國文、英文、體育等課程,學生需要修習及格才能畢業。
通識:通識中心將課程分成幾大領域,學生需要修滿六門且不重複的領域才能夠畢業。
專業選修:學生主修系上所規劃的專業選修課程,學生可以依照自身興趣來選擇課程修習。
自由選修:學生主修系上所規定的能夠承認的他系選修課程,學生可選擇外系課程或通識中心所開的通識。
我們想做出的課程推薦系統,是為了極大化學生在專業領域的知識,所以我們需要理解説,何謂專業領域知識,那又要怎麼去提升學生的專業領域知識。
專業領域知識,我們將其定義為學生在他的主修系上的專業課程,而這些專業課程又分為專業必修與專業選修,由於專業必修是系上對於學生的課程規劃,學生也需要將這些專業必修都拿到及格分數才能夠畢業,所以在推薦上我們會選擇推薦專業選修課程,專業選修課程也是各系上在課程規劃時的選修課程,是學生依照自己的興趣去做選擇修習課程,所以在推薦課程時,我們會針對專業選修課程去做推薦。這兩種專業課程皆屬於專業領域的知識,而專業選修課程是我們推薦的目標,所以我們能夠擁有的極大化條件,會專注於學生在大學四年必須修的專業必修課程。
專業必修課程在各個年級修的都不相同,以經濟系來說,大一時學生會修經濟學原理,到了大二才會修個體經濟學,這是因為系上在規劃課程安排時,隨著年級提升,課程內容會從淺入深、從窄入廣,而能夠在這樣的專業領域成長,我們需要看得是學生在這四年累積修習下來的課程表現,所以我們需要極大化條件的目標變數將是專業必修累積平均成績。
i生在T年級的專業必修累積平均成績iT定義如下: \[ 專業必修累積平均成績_{iT}=\frac{\sum_{t=1}^{T}\sum_{s=1}^{n_{i,t}}專業必修科目成績_{its}*學分數_{its}}{\sum_{t=1}^{T}\sum_{s=1}^{n_{i,t}}學分數_{its} } \]
其中\(n_{i,t}\)為該i生在t年級所修之專業必修科目數。
這個成績計算方式,正是學校在計算每學期學生排名時的成績計算方式,將該學期專業必修科目成績乘上對應學分數後相加,再除以該學期總修習學分,並且以逐年累積的方式,計算同學每個年級累積過去的專業必修科目成績與學分數,做逐年相加,這樣的累積方式,也是因為我們在做推薦時,是針對各個不同學生站在不同年級的角度去做推薦,所以必須以累積的方式去討論。
在這裡,累積平均指得是:針對各年級,將他過去到該年級結束所修之專業必修課程進行不分年級混合的平均成績計算。
以下我們討論四個不同年級的專業必修累積平均成績機率密度分佈:
從圖中可以得知,專業必修累積平均成績在不管哪個年級幾乎都很一致座落在約80分上下,表示專業必修累積平均成績不會隨著年級變動而有太大的變動,但是如果是系別差異,可能對於分數的區間就不一樣了。
分學院來看各年級的專業必修累積平均成績箱型圖,社會科學院的累積專業科目分數較高,電機資訊學院則較低,已經可以明顯看出各院在給分上的不同。
這邊顯示了各個系在各年級的專業必修累積平均成績箱型圖,更明顯可以看出分數的累積變化,以及各系的分數差異。比方說社會工作學系的分數差異較小,中位數也比較高;幾個比較高分的系別如應用外語學系、公共行政暨政策學系與中國文學系,顯示出他們在成績給分上較寬裕。
在以上的兩個圖表中,我們證實了每個系在專業必修平均分數上的差異很大,也因為專業必修課程的安排會因為各系不同,有些系在四年級便沒有專業必修,所以為了使我們定義出的專業領域知識是依據各系所不同而有不同的專業領域知識水準,不能只是單純的極大化專業必修平均成績,而是依據系所不同去做極大化條件,我們最終極大化的目標將會是同屆同班同學的專業必修累積平均成績排名,也就是專業必修累積平均成績PR,才能夠讓目標變數更有意義。其中為何採用累積平均成績來描述PR,是因為若僅使用單年級專業必修課程來進行PR排序,會使得某些學生在某些年級時沒有專業必修成績而出現缺失資料,因此我們才使用累積平均成績來進行排序,並以之為極大化條件。
在上一節我們知道推薦專業選修所需要的限制式條件,我們再來進一步去理解學生在排課時,將會受到什麼樣的影響,而去決定它的排課內容。
我們在推薦專業選修課程時,需要基於學生曾經學過的課程,以及新學期課表內容,才能提升他在新的年級時專業必修累積平均成績PR。在每一次推薦出的課表,都可以是學生選課時的參考依據,而這張課表我們能夠先以抽象的方式理解。
一張課表所包含的訊息有很多:
一星期要來上多少小時的課,也就是時間預算的概念。
一星期的課程中,有多少是專業課程,如專業必修、專業選修,又有多少是非專業課程,如校訂必修、自由選修,也就是專業程度的概念。
與專業核心關連:在專業課程中,有多少課程是與學生主修專業知識有連結。
一張課表顯示出一個禮拜七天所需要上的課程時數,而上課時數多寡對於專業必修累積平均成績PR會有正反兩面的影響,比方說,一個禮拜上課時數多,以正向影響來說,是可以快速增長知識,對於專業必修累積平均成績PR也會因為學生在該領域理解的越多,而提升在班上的排名,因為在學期中會參雜著專業課程,時數越多,專業課程學的越多;但是如果以負面影響來討論上課時數的話,則有可能同學會因為一個禮拜的課程安排太多,導致同學無法有其他時間做複習,而讓所有科目成績低落。由於時數的表示與學分數有很大的關聯,所以我們將考慮年級修習總學分數。
由於各個系所每個年級規劃的課程安排不同,所以在修習的時數上,或是給分的分數上也都不同,為此在以下的討論,我會將總學分與專業必修平均成績都針對系別去除學系平均。
從上表可以得知,學生各個年級的總學分數多寡與他在各年級專業必修平均成績會隨著年級升高而從正相關變負相關,在一年級時,大部分學生的專業必修普遍修得多,一年級總學分之中的專業必修佔比較大,所以在專業必修平均成績表現上只有些微正相關;到了二年級隨著學生自主排課,正相關又再強烈一點,而三年級時兩者已開始呈現負相關,造成此現象的可能原因是,通常學生都會把課集中在一、二年級修完,如果該位學生到了三、四年級的學分還是修很多,將會降低他在專業必修平均成績表現,可能可以顯現出該位學生在專業必修上是因為被當而延修至今。
一張課表也可以顯示出課程種類的比例,學生往往在選課時會同時考慮專業必修、專業選修、校訂必修、自由選修,而其中兩種課程即是專業領域知識的組成-專業必修與專業選修,當一學期的課表中,這兩者的比例佔總學期越高,它在專業領域的知識可能因此吸收越多(或反而造成太大的修課壓力),所以我們需要考慮在年級總學分數中,各種類課程的配置比例,專業課程與非專業課程(共同必修、通識、體育、軍訓等)的比例。
從上表中我們可以得知,如果我們在安排學生課表時,專業必修學分的比例與專業必修平均成績呈現負相關,當該學年專業必修學分佔該學年總學分越高,會些微的降低專業必修平均成績,由此可知,當一個課表中專業必修如果給得太多,會使得學生無法完全吸收。不過學分比例也是由其他種類課程學分數所組成,主要區分為專業必修、專業選修、非專業課程,下面兩張圖則是單看專業必修、專業選修學分數的高低是否影響專業必修平均成績表現。
註:四年級學生必修學分數過多的原因是因為,我們將四年級含以上都歸類在四年級的資料中。
圖一討論的是專業必修學分數,二、三、四年級都明顯且逐漸的呈現負相關,這裏比較能看出的是學生是否有重修的情況發生,尤其是四年級的同學還在重修時,它的專業必修平均成績與專業必修學分數是呈現高度負相關;一年級時大部分同學的課程安排是系上給定,所以呈現正相關的關係,且去除系別平均數後,資料點多數集中在零學分的地方。
圖二討論的是針對專業選修學分數,與必修學分數不同的是,在二、三年級時專業選修學分數仍持續與專業必修平均成績呈現正向關係,看得出來每個學年專業選修修得越多,不會干預太多學生在專業必修的表現,只有在四年級時,如果課程安排的專業選修太多,則會明顯讓學生在四年級時的專業必修平均成績下降,其主要原因可能還是學生在接近畢業前,如果仍有專業必修在修,表示學生本身的表現不太好,且過多的專業選修反而會讓學生分心導致成績更低落。同一學期所討論的排課問題會影響t期專業核心課程的表現,那過去幾個學期累積下來的專業選修,是不是也會影響到t期專業核心課程的表現呢?
學生一年級時,學分主要是由必修組成,專業選修不會太多,所以與二年級的專業必修平均成績表現僅有些微的正向關係,不過隨著年級提升,隨著學生累積了過往年級在專業選修上的修課時數(學分數),它與t+1期的專業必修平均成績表現出他們之間逐漸提升正向關係,也就是學生專業選修上的累積,的確會正向影響到之後專業核心。
這個章節我們得到的是該學期所有課程各自的時間安排(學分數多寡),以及時間所拆出來的專業度(專業必修學分數、專業選修學分數多寡),是如何影響著我們的目標變數。真正以知識含量來去討論的話,課程百百種,學生也百百種,如何概化到每一個課程、每一個學生,則是一個問題,在下面的章節則要開始探討各個專業選修對於該領域專業核心的影響。
在推薦給同學的課表中,除了時間時數的安排、專業必修的學分比例,會影響到學生在專業必修平均成績的表現(進而影響專業必修累積平均成績PR)以外,還有課表中安排哪些專業選修,才會真正增進到累積專業領域知識(專業必修累積平均成績PR)。
系上會開所謂的專業選修課程,但並非所有的專業選修課程都與系上專業領域知識核心有關連,有些是影響到核心知識的深化,有些則是著重在廣化(核心知識的延伸),我們無法單純以課程資料去判定專業選修課程是否為影響核心專業領域的知識(學校的課程資料僅能表示出該選修是開給哪些系級),所以我們必須衡量出專業選修的深/廣化指標,才能定義清楚影響到專業領域知識的專業選修。
這邊我們可以先提到所謂的專業領域連結度,我們以專業選修與專業必修的人數流向比例來作判定,由於專業選修是是基於核心知識(專業必修)的必要基礎考量,往往有些專業選修會有年級限制,導致某些專業選修的學生多數是修完某些年級必修後才會選擇此選修,也有可能是學生需要具備某項專業必修知識後,才會考慮修這門專業選修,這時就有先修某些必修課後才流向後修此選修課的現象。
為此,我們針對學生i在t年級的課表,計算所選每門專業選修課與他在t-1年級(或更之前)的必修課之先後流向指數,指數越高表示連結度越強。
\[ \Pr(本年級專業選修|之前年級專業必修) \]
transition_matrix的每個row為專業必修,每個column為專業選修,只要有一位同學在先修了某專業必修,並後修了某專業選修,則在該欄位加一,最終除以總共修過該專業必修的人數。專業必修與專業選修的流向機率值越高,表示專業選修與其專業必修課程的連結度越高,也就是該專業選修可能為該專業必修的延伸課程,是合理的修課順序,不是跳修過深的課。為方便以後討論我們稱此機率為專業選修流向指數。
那些牽連著許多紅線且向外發散的課程,大部分為大一必修(ex. 經濟學原理),原因是幾乎所有的人在大一的必修選課上是相同的,而開始出現分歧點的地方,將會發生在選擇大二課程的時候,因為可能開始會出現有些同學有擋修,或者是逆行修課的同學(ex. 某同學在修完大一課程後,先跳去選擇大三課程),導致修課比例會逐漸有所差異。
同學在每學期安排課表時,通常會先考慮這學期該修多少學分、是否插入體育或通識,接下來就是安插該年級的必修課程,最後會開始考慮專業選修,而我們要幫助學生的,就是建議學生幾門專業選修,並且能夠提升該學期在專業核心領域的表現(專業必修累積排名表現)。
不過專業選修不是想選就能選,有幾項特定因素會讓學生無法選擇這門專業選修:
擋修:該專業選修可能有規定必須要幾年級以上才能修,或是要先修過什麼必修課才能修,而這邊不考慮作法,因為系統可以根據學生年級直接去除掉。
知識不足:這是最常見的問題,該專業選修可能非常願意大家修習,但實際上可能學生必須蘊含某一定程度的專業核心知識,再去修這門專業選修會比較好。
因為專業知識不足而讓學生修得很辛苦或表現不好,是一個很重要需要考慮的原因,藉此,我們可以拿前面所提到的專業選修流向指數來討論一個專業選修背後需要先蘊含怎麼樣基礎的專業必修。
每個學生在選擇選修課時都來自不同的背景知識(修過怎麼樣的專業必修課),而每一門專業選修的背後都藏著一個可以量化出來的值,該值代表的是,這門專業選修課B,是由哪些擁有怎麼樣專業必修A集合背景的學生所修,也就是說該專業選修B可以得知其專業核心知識背景。
一個學生i在t年級選選修課B,而他在過去已修完他的必修集合\(S_{i,t-1}\),對他而言,他若選了B,則有表示他是帶著這樣必修集合知識的蘊含去修這門專業選修B,再將所有這堂課學生的背景知識做平均,則可以得出代表該專業選修的核心知識背景。
\[ i學生對於B的核心知識背景=\Pr(B|A \in S_{i,t-1})=\frac{1}{\Pr(A\in S_{i,t-1})}Pr(B,A\in S_{i,t-1}) \]
\[ B的核心知識背景=\frac{\sum_{i}^n\Pr(B|A \in S_{i,t-1})}{n} = b_j \]
而現在,每個學生在每個年級時,修的那幾門專業選修課已經成為了可以量化的數值,接著將每一學年他所選擇的專業選修課程的核心知識背景做平均,即可得知目前到這學年的這位學生,所蘊含的核心專業領域知識有多少。
設\(X_{i,t}\)為i學生在t期時,已修的專業選修集合,則\(b_j \in X_{i,t}\)。
但是這其中又會面臨該流向比例高,也可能只是因為該專業選修是熱門課程,可能這門專業選修是好拿分、膾炙人口的課程,所以必須要進一步探討該課程的深度,有這兩個面向才能得出真正能影響核心專業知識的專業選修。
我們可以看那些修過這門選修課的同學,在過往專業必修平均成績PR的表現,如果這門選修課其同學PR離散程度高,則表示該選修課為廣化選修課,可能因為熱門而比例高;如果其PR離散程度越低且趨向高PR者,則表示該選修屬於比較深的課程。這個部分我們以一門分系別討論後的專業選修課的平均PR受眾代表學生程度,再以PR分佈的四分位距IQR來當作課程離散程度。
可能的區分依據,是以所有專業選修課的受眾Bpr中位數,以及所有專業選修課的PR分佈四分位距Biqr的中位數來做區分
\[ \begin{array}{c|lcr} \text{Bpr}/\text{Biqr} & \text{中位數以上} & \text{中位數以下} \\ \hline \text{中位數以上} & wide & deep \\ \text{中位數以下} & \text{涼} & \text{涼} \\ \end{array} \]
針對是涼課的專業選修,我們只將它當作是一般選修課程,與專業核心沒有太大相關性,所以該堂課的\(b_j\)會乘上0,而廣度課程(熱門課程),將對其\(b_j\)乘上\(\frac {1}{Biqr_j}\)來削弱和背景核心知識強度;深度課程則是對其\(b_j\)乘上\(Biqr_j\)來提升該專業選修對背景核心知識的強度。
區分完成之後再將之令回\(b_j\)。
由於我們的\(PR_{it}\)是過去累積出來的平均成績表現,而後做出班級內部排名,所以新一期的\(PR_{it}\)將會與過去的\(PR_{it-1}\)有相關,所以我們先將此加入回歸式。
\[ PR_{it}=PR_{it-1}+\epsilon_t \]
顯示成績與學分數的正負向關連受成績影響。
學分數的影響有可能2次式
年級可能也要放進去。(要考慮到是幾年級的課表)或許是反應出畢業學分要求的內生配置考量。
在2.4.1時間預算的章節中,我們討論了新學期的課表安排(時數上),與專業領域表現的關係,各年級的影響都會不同,我們的年級變數也需要放入,必須考慮到是幾年級的課表(且可能能反映出畢業學分要求的內生配置)。新學期的分數配置,與過往成績表現也有相關,能夠反映出學生是否對於畢業有困擾,故最後我們加入\(學分數_{it}\)與\(PR_{it-1}\)的交叉相乘項。
\[ PR_{it}=PR_{it-1}+\beta_1*學分數_{it}+\beta_2*學分數_{it}*PR_{it-1}+\epsilon_t \]
如果單單討論學分數,僅能知道學分數對該年級學生的畢業影響,不過我們知道一學年的總學分數,是包含了專業必修、專業選修、非專業課程。
\[ \begin{array}{lcl} PR_{it} = PR_{it-1}&+&\beta_1*(必修學分+非必修學分)_{it}+\beta_2*(必修學分+非必修學分)_{it}*PR_{it-1}+\epsilon_t\\ PR_{it} = PR_{it-1}&+&\beta_1*(必修學分/學分數+非必修學分/學分數)學分數_{it}\\ &+& \beta_2*(必修學分/學分數+非必修學分數/學分數)學分數_{it}*PR_{it-1}+\epsilon_t\\ \end{array} \]
藉由2.4.2專業度的章節,我們可以將學分數拆開來對其中各類型課程占比來做討論,所以在回歸式的變數我們也將學分數拆成必修學分與非必修學分。
\[ \begin{array}{lcl} PR_{it} = PR_{it-1} &+& \beta_{1a}*必修學分_{it}+\beta_{1b}*非必修學分_{it}\\ &+&\beta_2*(必修學分+非必修學分)_{it}*PR_{it-1} + \epsilon_t\\ \end{array} \]
2.4.2圖三的討論,即是過去專業選修的累積時數,我們將其也加入回歸式。
\[ \begin{array}{lcl} PR_{it} = PR_{it-1} &+& \beta_{1a}*必修學分_{it}+\beta_{1b}*非必修學分_{it}\\ &+&\beta_2*(必修學分+非必修學分)_{it}*PR_{it-1}\\ &+& \beta_{3}*專業選修學分_{it-1} + \epsilon_t\\ \end{array} \]
以上我們已經有了時間預算的內容,接下來就是加入真正與核心課程內容的課程,i學生在t學期時已經具備了這些\(b_j \in X_{i,t}\)的專業選修知識,將t期的\(b_{j,t}\)做平均,其代表了截至t期該為i學生所擁有專業核心知識內容的累積,並放入回歸式。
\[ \begin{array}{lcl} PR_{it} = PR_{it-1} &+& \beta_{1a}*必修學分_{it}+\beta_{1b}*非必修學分_{it}\\ &+&\beta_2*(必修學分+非必修學分)_{it}*PR_{it-1}\\ &+& \beta_{3}*專業選修學分_{it-1} + \beta_{4}*mean(b_{j,t}) + \epsilon_t\\ \end{array} \]